首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有双引号的csv读写器的阅读

有双引号的csv读写器的阅读
EN

Stack Overflow用户
提问于 2014-10-15 11:10:02
回答 1查看 9.3K关注 0票数 4

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

代码语言:javascript
复制
"001-0000265-003"|"Some detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"

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

代码语言:javascript
复制
using (var input = new CsvReader(stream, true, '|'))
{
//logic to create an xml here
}

在没有双引号的情况下,这很好。但是当那些骗子像这样

代码语言:javascript
复制
"001-0000265-003"|"Some " detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"

读者抛出异常

代码语言:javascript
复制
An unhandled exception of type 'LumenWorks.Framework.IO.Csv.MalformedCsvException' occurred in LumenWorks.Framework.IO.dll

然后我使用了CsvReader构造函数,它包含7个参数,

代码语言:javascript
复制
CsvReader(stream, true, '|', '"', '"', '#', LumenWorks.Framework.IO.Csv.ValueTrimmingOptions.All))

但我还是会犯同样的错误。请提供任何建议。

我读了一些复杂的文件如下,

代码语言:javascript
复制
"001-0000265-003"|"ABC 33"X23" CDE 32'X33" AAA, BB'C"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 12:22:18

我已经用你的样本数据对它进行了测试,很难修复这个格式错误的行(F.E。来自Catch-block)。因此,我不会使用引号字符,而是使用管道分隔符,然后通过csv[i].Trim('"')删除csv[i].Trim('"')

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26381067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档