C# 获取一个变量的内容,其中行的一部分与搜索字符串C匹配#

C# 获取一个变量的内容,其中行的一部分与搜索字符串C匹配#,c#,csv,C#,Csv,我正在将几个csv文件读入var,如下所示: var myFullCsv = ReadFile(myFullCsvFilePath); var masterCsv = ReadFile(csvFilePath); var extraFilesCsv = myFullCsv.Except(masterCsv); 每个csv中的某些行条目出现在两个文件中,我可以创建一个新的var,其中包含myFullCsv中存在但masterCsv中不存在的行,如下所示: var myFullCsv = Rea

我正在将几个csv文件读入var,如下所示:

var myFullCsv = ReadFile(myFullCsvFilePath);
var masterCsv = ReadFile(csvFilePath);
var extraFilesCsv = myFullCsv.Except(masterCsv);
每个csv中的某些行条目出现在两个文件中,我可以创建一个新的var,其中包含myFullCsv中存在但masterCsv中不存在的行,如下所示:

var myFullCsv = ReadFile(myFullCsvFilePath);
var masterCsv = ReadFile(csvFilePath);
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\,
示例所需输出(我总是在第3列中查找与字符串匹配的条目,在本例中为9452d316):

你可以用:

这只是执行您在问题中提到的“拆分和检查”,但这是非常简单的代码。如果你只考虑第三逗号,它可能会更有效,但我不会担心,直到它被证明是一个问题。< /P> 就我个人而言,我可能会将每一行解析为一个具有有意义属性的对象,而不是将其视为一个字符串,但这可能就是您所说的“漫长的道路”的意思

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

您可以使用:

这只是执行您在问题中提到的“拆分和检查”,但这是非常简单的代码。如果你只考虑第三逗号,它可能会更有效,但我不会担心,直到它被证明是一个问题。< /P> 就我个人而言,我可能会将每一行解析为一个具有有意义属性的对象,而不是将其视为一个字符串,但这可能就是您所说的“漫长的道路”的意思


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

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

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

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

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

Except
显然是一些自定义方法,它看起来很简单,因为您只需调用它,但您认为它背后是什么?实际上,正如您所说,
是一种非常漫长且低效的方法。编程并不是一种魔术,你知道,你可以用一个单词来完成你想做的任何事情。@MDeSchaepmeester:是什么让你认为除了
之外的
的使用效率很低?它可能是从
masterCsv
构建一个
HashSet
,它们在
myFullCsv
上迭代,生成不在该集中的项。JonSkeet我并不是想暗示它在计算性能方面是低效的,我只是引用了OP的一部分话,以表明这种方法背后也有“很长的路”,他可能不理解“长”的相对性在文件处理方面。我想我主要是在寻找有效的代码长度。但根据我的经验,如果代码更短,计算速度也会更快,尽管我承认情况并非总是如此。@SteveW LINQ可能会有欺骗行为,根据表达式的不同,一行代码在计算方面可能相当于10或20,这只是一个更优雅和“功能性”的代码表达对集合的查询的方式。在Jon Post的示例中,可以将其解析为字符串数组和foreach循环,进行比较并将匹配项分配给预先声明的列表。相反,LINQ使您能够在一行中完成所有操作,在我看来,这使它更具可读性。
除了
显然是一些自定义方法,它看起来很简单,因为您只需调用它,但您认为它背后是什么?实际上,正如您所说,
是一种非常漫长且低效的方法。编程并不是一种魔术,你知道,你可以用一个单词来完成你想做的任何事情。@MDeSchaepmeester:是什么让你认为除了
之外的
的使用效率很低?它可能是从
masterCsv
构建一个
HashSet
,它们在
myFullCsv
上迭代,生成不在该集中的项。JonSkeet我并不是想暗示它在计算性能方面是低效的,我只是引用了OP的一部分话,以表明这种方法背后也有“很长的路”,他可能不理解“长”的相对性在文件处理方面。我想我主要是在寻找有效的代码长度。但根据我的经验,如果代码更短,计算速度也会更快,尽管我承认情况并非总是如此。@SteveW LINQ可能会有欺骗行为,根据表达式的不同,一行代码在计算方面可能相当于10或20,这只是一个更优雅和“功能性”的代码表达对集合的查询的方式。在Jon Post的示例中,可以将其解析为字符串数组和foreach循环,进行比较并分配matc