将文本文件解析为CSV C#
我不熟悉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 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
这里有更好的解释:您不必首先将其解析为数据表。您可以在读取源文件时直接将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;
}