获取Var的内容,其中部分行匹配搜索字符串C#

时间:2014-06-20 15:08:28

标签: c# csv

我正在阅读几个csv文件到var' s,如下所示:

var myFullCsv = ReadFile(myFullCsvFilePath);
var masterCsv = ReadFile(csvFilePath);

每个csv中的一些行条目都出现在两个文件中,我能够创建一个新的var,其中包含myFullCsv中存在但不在masterCsv中的行,如下所示:

var extraFilesCsv = myFullCsv.Except(masterCsv);

这很棒,因为它非常简单。但是,我现在希望在myFullCsv中识别行中出现特定字符串的行。该字符串将对应于csv数据的一列。我知道我可以通过读取var的每一行并将其拆分,然后将我感兴趣的字段与我正在搜索的字符串进行比较来实现。然而,与我上面的代码使用'除外'相比,这似乎是一种非常长且效率低下的方法。命令。 有没有什么方法可以通过一个非常简单的命令从myFullCsv获取行,或者我必须做很长的路?请不要让我表现出漫长的道路,因为尽管我能做到这一点,但我还是试图避免编码。

示例csv数据:

07801.jpg,67466,9452d316,\Folder1\FolderA\,
07802.jpg,78115,e50492d8,\Folder1\FolderB\,
07803.jpg,41486,37b6a100,\Folder1\FolderC\,
07804.jpg,93500,acdffc2b,\Folder2\FolderA\,
07805.jpg,67466,9452d316,\Folder2\FolderB\,

示例所需的输出(我总是在第3列中查找匹配字符串的条目,在本例中为9452d316):

07801.jpg,67466,9452d316,\Folder1\FolderA\,
07805.jpg,67466,9452d316,\Folder2\FolderB\,

2 个答案:

答案 0 :(得分:4)

可以使用:

var results = myFullCsv.Where(line => line.Split(',')[2] == targetValue)
                       .ToList();

这只是你在问题中提到的“拆分和检查”,但这是非常简单的代码。如果你只考虑第三个逗号,它可能会更有效率,但我不会担心它,直到它被证明是一个问题。

就我个人而言,我可能会将每一行解析为具有有意义属性的对象而不是将其视为字符串,但这可能就是“长路”的意思。

请注意,这不会执行任何验证,或尝试处理转义的逗号或列数较少的行等。根据您的数据源,可能需要使其更加健壮。

答案 1 :(得分:0)

你可以使用正则表达式。它不要求每一行至少有3个元素。它不为每一行分配字符串数组。因此它可能更快,但你必须测试它来证明它。

var regex = new Regex("^.+?,.+?," + Regex.Escape(targetValue) + ",");
var results = myFullCsv.Where(l => regex.IsMatch(l)).ToList();