将文本文件解析为CSV C#

时间:2011-09-14 14:49:42

标签: c# parsing csv

我是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。

3 个答案:

答案 0 :(得分:3)

这个简单的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;
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用Linq to Text files并拆分“:”上的一行来获取两个不同的列。

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