簡體   English   中英

使用LINQ將文本文件解析為CSV

[英]Parsing a text file to CSV using LINQ

我是LINQ的新手,我想學習它在解析文本文件時的有用性,而不是使用像Perl或Ruby這樣的腳本語言。 我已經生成了一個由“CR”和“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中真正做到這一點,所以不要試圖強迫它進入它。

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM