将文本文件解析为CSV C#

将文本文件解析为CSV C#,c#,parsing,csv,C#,Parsing,Csv,我不熟悉C#development。我需要解析一个巨大的文本文件,每行包含几行数据。输出将是一个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 Fo

我不熟悉C#development。我需要解析一个巨大的文本文件,每行包含几行数据。输出将是一个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 缩写:蒂芙 提案名称:燃油经济性热力系统集成 合约编号:233826 文书:CP–FP # 缩写:流线型 提案名称:创新船舶推进概念的战略研究 合约编号:233896 文书:CP–FP 其中#代表一项新记录。现在这个文本文件中有数百条“记录”。我希望能够将所有内容解析为CSV,其中包含首字母缩写、提案名称等列,以及包含每条记录的实际数据的行

有没有最好的方法来尝试这一点

我猜在将数据解析为CSV之前,我必须将数据解析为一个中介(如DataTable)。

您可以使用并拆分上的行:“以获得两个不同的列

下面是更好的解释:

您可以使用并拆分上的行:“以获得两个不同的列


这里有更好的解释:

您不必首先将其解析为数据表。您可以在读取源文件时直接将CSV输出。显然,如果源的每个记录中字段的顺序和存在是一致的,那么这就更容易了


但是,对于与CSVs有关的事情,你应该考虑使用专门的图书馆。比如。

您不必首先将其解析为数据表。您可以在读取源文件时直接将CSV输出。显然,如果源的每个记录中字段的顺序和存在是一致的,那么这就更容易了


但是,对于与CSVs有关的事情,你应该考虑使用专门的图书馆。类似。

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

输出:

“TIFF”、“燃油经济性热力系统集成”、“233826”、“CP–FP” “流线型”、“创新船舶推进概念的战略研究”、“233896”、“CP–FP” 助手方法:

静态IEnumerable GroupDelimited(
此IEnumerable源,Func分隔符)
{
var g=新列表();
foreach(源中的变量x)
{
if(分隔符(x))
{
收益率g;
g=新列表();
}
其他的
{
g、 加(x);
}
}
收益率g;
}

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

输出:

“TIFF”、“燃油经济性热力系统集成”、“233826”、“CP–FP” “流线型”、“创新船舶推进概念的战略研究”、“233896”、“CP–FP” 助手方法:

静态IEnumerable GroupDelimited(
此IEnumerable源,Func分隔符)
{
var g=新列表();
foreach(源中的变量x)
{
if(分隔符(x))
{
收益率g;
g=新列表();
}
其他的
{
g、 加(x);
}
}
收益率g;
}

+1:专用库将正确处理逗号和双引号字符(如果数据中出现了换行符,则会正确处理换行符;如果双换行符表示字段分隔符,如示例中所示,则文件格式可能支持将换行符作为数据)。+1:专用库将正确处理逗号和双引号字符(如果数据中出现了换行符,则为换行符;如果双换行符表示示例中出现的字段分隔符,则文件格式可能支持将换行符作为数据)。我遇到以下错误:“System.Collections.Generic.IEnumerable”不包含“GroupDelimited”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“GroupDelimited”(是否缺少using指令或程序集引用?)c:\users\user\documents\visualstudio 2010\Projects\Fileparser\Fileparser\Program.csIf这是一个“简单的”LINQ查询,我不想看到复杂的查询。我遇到以下错误:“System.Collections.Generic.IEnumerable”不包含“GroupDelimited”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“GroupDelimited”(是否缺少using指令或程序集引用?)c:\users\user\documents\visual studio 2010\Projects\Fileparser\Fileparser\Program.csi如果这是一个“简单”的LINQ查询,我不希望看到复杂的查询。
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;
}