[英]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.