获取行部分匹配搜索字符串c#的Var的内容

本文关键字:Var 字符串 搜索 行部 获取 | 更新日期: 2023-09-27 18:09:29

我正在读取几个csv文件到var中,如下所示:

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

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

var extraFilesCsv = myFullCsv.Except(masterCsv);

这很好,因为它非常简单。但是,我现在希望识别myFullCsv中出现特定字符串的行。该字符串将对应于csv数据的一列。我知道我可以通过读取var的每一行并将其拆分,然后将我感兴趣的字段与我正在搜索的字符串进行比较来做到这一点。然而,与我上面使用"Except"命令的代码相比,这似乎是一个非常冗长和低效的方法。是否有一些方法,我可以得到从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',

期望输出示例(我总是在第三列中寻找与字符串匹配的条目,在本例中为9452d316):

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

获取行部分匹配搜索字符串c#的Var的内容

可以使用:

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

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

就我个人而言,我可能会将每行解析为具有有意义属性的对象,而不是将其作为字符串处理,但这可能就是您所说的"long way"。

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

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

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