gpt4 book ai didi

c# - 使用 lumenworks csv 阅读器读取带有双引号的 csv

转载 作者:太空狗 更新时间:2023-10-30 00:51:34 24 4
gpt4 key购买 nike

我正在使用 Lumenworks csv 阅读器读取 csv 文件。下面是一个示例记录

"001-0000265-003"|"Some detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"

我用下面的构造函数创建了一个类来读取这个文件

using (var input = new CsvReader(stream, true, '|'))
{
//logic to create an xml here
}

当 details 中没有双引号时,这可以正常工作。但是当这样的情景发生时

"001-0000265-003"|"Some " detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"

读者抛出异常

An unhandled exception of type 'LumenWorks.Framework.IO.Csv.MalformedCsvException' occurred in LumenWorks.Framework.IO.dll

然后我使用了带有 7 个参数的 CsvReader 构造函数,

CsvReader(stream, true, '|', '"', '"', '#', LumenWorks.Framework.IO.Csv.ValueTrimmingOptions.All))

但我仍然遇到同样的错误。请提供任何建议。

我正在阅读一些复杂的文件,如下所示,

"001-0000265-003"|"ABC 33"X23" CDE 32'X33" AAA, BB'C"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"

最佳答案

我已经用您的示例数据对其进行了测试,修复这条格式错误的行非常困难(例如来自 Catch block )。所以我不会使用引号字符,而是只使用竖线分隔符并稍后通过 csv[i].Trim('"') 删除 "

这是一个解析文件并返回所有行字段的方法:

private static List<List<string>> GetAllLineFields(string fullPath)
{
List<List<string>> allLineFields = new List<List<string>>();
var fileInfo = new System.IO.FileInfo(fullPath);

using (var reader = new System.IO.StreamReader(fileInfo.FullName, Encoding.Default))
{
Char quotingCharacter = '\0'; // no quoting-character;
Char escapeCharacter = quotingCharacter;
Char delimiter = '|';
using (var csv = new CsvReader(reader, true, delimiter, quotingCharacter, escapeCharacter, '\0', ValueTrimmingOptions.All))
{
csv.DefaultParseErrorAction = ParseErrorAction.ThrowException;
//csv.ParseError += csv_ParseError; // if you want to handle it somewhere else
csv.SkipEmptyLines = true;

while (csv.ReadNextRecord())
{
List<string> fields = new List<string>(csv.FieldCount);
for (int i = 0; i < csv.FieldCount; i++)
{
try
{
string field = csv[i];
fields.Add(field.Trim('"'));
} catch (MalformedCsvException ex)
{
// log, should not be possible anymore
throw;
}
}
allLineFields.Add(fields);
}
}
}
return allLineFields;
}

使用包含示例数据的文件进行测试和输出:

List<List<string>> allLineFields = GetAllLineFields(@"C:\Temp\Test\CsvFile.csv");
foreach (List<string> lineFields in allLineFields)
Console.WriteLine(string.Join(",", lineFields.Select(s => string.Format("[{0}]", s))));

[001-0000265-003],[Some detail],[detal1],[detail2],[detal3],[detail4],[detail5],[detail6]
[001-0000265-003],[Some " detail],[detal1],[detail2],[detal3],[detail4],[detail5],[detail6]

关于c# - 使用 lumenworks csv 阅读器读取带有双引号的 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26381067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com