C#在文件中从CSV中查找数据

本文关键字:查找 数据 CSV 文件 | 更新日期: 2023-09-27 18:30:02

我有一行值作为CSV文件,我需要找出它们中的每一个是否都存在于另一个文件中(即XML)。

我已经读取了CSV数据,拆分了值,搜索代码有效,但输出了错误的结果("查找"不存在的值)我愿意帮忙。感谢Shabi

我的代码

string csvFile = @"Afile.csv";
string[] lines = System.IO.File.ReadAllLines(csvFile);
string namesValues = lines[0];
List<string> allValidNamesValues = namesValues.Split(',').ToList();
bool result = false;
string DeviceName = Phone.Tag("Name").Value();
if (allValidNamesValues.Any(vn => DeviceName.IndexOf(vn, StringComparison.OrdinalIgnoreCase) != -1))
{
    Info = string.Format("The Device is supported");
    return true;
}
return result;

C#在文件中从CSV中查找数据

我猜这里的主要问题是您只处理文件的第一行(lines[0])。可以使用嵌套循环处理所有行,也可以使用SelectMany(LINQ)。例如(使用ReadLines来避免一次缓冲所有数据):

static readonly char[] comma = { ',' };
...
if(File.ReadLines(csvFile).SelectMany(x => x.Split(comma)).Any(
        vn => DeviceName.IndexOf(vn, StringComparison.OrdinalIgnoreCase) != -1))
{
    // whatever
}

注意,我不相信字符串测试是正确的(对我来说,有vn.IndexOf(DeviceName, ...)似乎更明显,但:如果没有例子,很难检查

要对CSV进行更正确的解析更为复杂;您应该考虑像LumenWorksCsvReader 这样的库

我建议你真的想要这样的东西:

  1. 测试CSV的第一列
  2. 跳过CSV标题(第1行)

的实现

 string DeviceName = Phone.Tag("Name").Value();
 string csvFile = @"Afile.csv";
 var result = File
   .ReadLines(csvFile) // You have no need to read all the lines 
   .Skip(1) // skip title, comment out this if CSV has no caption
   .Select(line => line.Split(',')) // providing that CSV doen't have quotations
   .Select(items => items[0]) // providing that 1ast column contains names
   .Any(name => String.Equals(name, DeviceName, StringComparison.OrdinalIgnoreCase));