繁体   English   中英

将文本文件解析为CSV C#

[英]Parsing a Text file to CSV C#

我是C#开发的新手。 我需要解析一个包含几行数据的巨大文本文件。 输出将是CSV文件。

该文件的格式遵循以下模式:

Acronym: TIFFE 
Name of proposal: Thermal Systems Integration for Fuel Economy
Contract number: 233826
Instrument: CP – FP
#
Acronym: STREAMLINE
Name of proposal: Strategic Research For Innovative Marine Propulsion Concepts
Contract number: 233896
Instrument: CP – FP

#代表新记录。 现在这个文本文件中有数百个“记录”。 我希望能够将所有内容解析为包含Acronym,Proposal名称等列的CSV以及包含每条记录的实际数据的行。

有没有最好的方法来尝试这个?

我猜我必须在将数据解析为CSV之前将数据解析为中间人 - 比如DataTable。

这个简单的LINQ语句将您的输入文件解析为一系列记录,并将每个CSV格式的记录写入输出文件(假设每个记录中字段的数量和顺序相同):

File.WriteAllLines("output.csv", File
    .ReadLines("input.txt")
    .GroupDelimited(line => line == "#")
    .Select(g => string.Join(",", g
        .Select(line => string.Join(line
            .Substring(line.IndexOf(": ") + 1)
            .Trim()
            .Replace("\"", "\"\""), "\"", "\"")))));

输出:

"TIFFE","Thermal Systems Integration for Fuel Economy","233826","CP – FP"
"STREAMLINE","Strategic Research For Innovative Marine Propulsion Concepts","233896","CP – FP"

辅助方法:

static IEnumerable<IEnumerable<T>> GroupDelimited<T>(
    this IEnumerable<T> source, Func<T, bool> delimiter)
{
    var g = new List<T>();
    foreach (var x in source)
    {
        if (delimiter(x))
        {
            yield return g;
            g = new List<T>();
        }
        else
        {
            g.Add(x);
        }
    }
    yield return g;
}

您不必首先将其解析为DataTable。 您可以在读取源文件时直接对您的CSV进行StreamWrite。显然,如果源的每个记录中的字段的顺序和存在是一致的,这会更容易。

但是,对于与CSV有关的任何事情,您应该考虑使用专门的库。 FileHelpers一样。

您可以使用Linq到文本文件并在“:”上拆分行以获得两个不同的列。

以下是更好的解释: http//schotime.net/blog/index.php/2008/03/18/importing-data-files-with-linq

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM