我正在开发一个读取2个csv文件的项目:
var myFullCsv = ReadFile(myFullCsvFilePath);
var masterCsv = ReadFile(csvFilePath);
然后创建一个新的var,其中包含myFullCsv中存在但不包含主Csv的额外行。代码很棒,因为它很简单:
var extraFilesCsv = myFullCsv.Except(masterCsv);
读入的csv文件包含如下数据:
c01.jpg,95182,24f77a1e,\Folder1\FolderA\,
c02.jpg,131088,c17b1f13,\Folder1\FolderA\,
c03.jpg,129485,ddc964ec,\Folder1\FolderA\,
c04.jpg,100999,930ee633,\Folder1\FolderA\,
c05.jpg,101638,b89f1f28,\Folder1\FolderA\,
但是,我刚刚发现每个文件中某些字符不匹配的情况。例如(JPG in caps):
c01.JPG,95182,24f77a1e,\Folder1\FolderA\,
如果数据是这样的,那么它不包含在extraFilesCsv中,但我需要它。任何人都可以告诉我如何使这段代码对文本的情况不敏感吗?
编辑:对不起,我忘了ReadFile不是标准命令。这是代码:
public static IEnumerable<string> ReadFile(string path)
{
string line;
using (var reader = File.OpenText(path))
while ((line = reader.ReadLine()) != null)
yield return line;
}
答案 0 :(得分:5)
我假设你已经读过两个csv文件并且有一个代表每个文件的字符串集合。
您可以在EqualityComparer
的调用中指定一个特定的Except()
,它指示在两个对象集合之间进行比较的类型。
您可以创建自己的比较器,或者假设两个集合都是字符串,请尝试指定忽略大小写的现有比较器:
var extraFilesCsv
= myFullCsv.Except(masterCsv, StringComparer.CurrentCultureIgnoreCase);
默认情况下,如果您没有指定比较器,它会使用EqualityComparer<TElement>.Default
,它会根据您要比较的类类型而有所不同。
对于字符串,默认情况下它首先进行直接a==b
比较,这是区分大小写的。 ( string
类的确切实现稍微复杂一些,但可能不必在此处发布。)