使用LINQ将文本文件解析为CSV

本文关键字:CSV 文件 LINQ 文本 使用 | 更新日期: 2023-09-27 18:20:10

我对LINQ完全陌生,我想了解它在解析文本文件时的有用性,而不是使用Perl或Ruby等脚本语言。我已经生成了一个由"CR"answers"LF"分隔的长列表,我想创建一个.CSV文件导出到Excel,其中只包含前三行。示例:

[CR][LF]
      Field: Microsoft.VSTS.Build.FoundIn[CR][LF]
      Name: Found In[CR][LF]
      Type: String[CR][LF]
      Use: Test project[CR][LF]
      Indexed: False[CR][LF]
      Reportable As: dimension[CR][LF]
      Synchronizes Identity Name Changes: False[CR][LF]
[CR][LF]
      Field: Microsoft.VSTS.Build.IntegrationBuild[CR][LF]
      Name: Integration Build[CR][LF]
      Type: String[CR][LF]
      Use: Test project[CR][LF]
      Indexed: False[CR][LF]
      Reportable As: dimension[CR][LF]
      Synchronizes Identity Name Changes: False[CR][LF]
[CR][LF]

(名单还在继续)

所需输出:

"Microsoft.VSTS.Build.FoundIn","Found In","String"
"Microsoft.VSTS.Build.IntegrationBuild","Integration Build","String"

我如何用LINQ最简单的方式写这篇文章?

使用LINQ将文本文件解析为CSV

您只是在空白行的"部分"之间切换。只需遍历行,将所有内容放入一个单独的缓冲区,直到到达一个空行。当你这样做时,处理缓冲区中的项目,清除它,然后重复。你不能在纯LINQ中简单地或优雅地做到这一点,所以不要试图强行将其输入。

var buffer = new List<string>();
foreach (var line in File.ReadLines(pathToFile))
{
    if (String.IsNullOrWhitespace(line))
    {
        ProcessSection(outputFile, buffer);
        buffer.Clear(); // or create a new one
    }
    else
    {
        buffer.Add(line);
    }
}
static void ProcessSection(StreamWriter outputFile, List<string> buffer)
{
    if (buffer.Count == 0) return;
    var contents = buffer.Take(3)
        .Select(line => String.Format("'"{0}'"", line.Substring(line.IndexOf(": ") + 2)));
    outputFile.WriteLine(String.Join(",", contents));
}