Разбор текстового файла в CSV с помощью LINQ - PullRequest
1 голос
/ 13 января 2012

Я совершенно новичок в 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 самое простоепуть возможен?

1 Ответ

4 голосов
/ 13 января 2012

Вы просто разрываете между "разделами" на пустых строках. Просто пройдитесь по строкам, выбрасывая все в отдельный буфер, пока не дойдете до пустой строки. Когда вы это сделаете, обработайте элементы в буфере, очистите его и повторите. Вы не можете сделать это в чистом виде 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...