首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当一行列太多时,Lumenworks CSV解析器会出错吗?

当一行列太多时,Lumenworks CSV解析器会出错吗?
EN

Stack Overflow用户
提问于 2014-05-19 15:38:42
回答 3查看 4.3K关注 0票数 0

我使用Lumenworks.Framework.IO.Csv.CsvReader读取Csv文件,并希望检测格式不良的文件。如果一行的列比标题少,那么它将抛出LumenWorks.Framework.IO.Csv.MissingFieldCsvException。但是,如果一行的列比标题多,那么在解析行时它只会截断行。有什么我可以设置的属性让它抛出吗?或者另一个CSV解析器,它高效、易用,并且会检测到这个问题吗?

我的测试文件看起来

代码语言:javascript
复制
Field 1,Field 2,Field 3,Field 4
This,data,looks,ok
But,this,has,too,many,fields

我的集成测试(NUnit)看起来像

代码语言:javascript
复制
[Test, ExpectedException(typeof(MalformedCsvException))]
public void Row_cannot_have_more_fields_than_the_header()
{
    using (var stream = File.OpenText("MoreColumnsThanHeader.csv"))
        new CsvParser().ReadCsv(stream);
}

我的代码来读取数据

代码语言:javascript
复制
public DataSubmission ReadCsv(StreamReader streamReader)
{
    var data = new DataSubmission();
    using (var reader = new CsvReader(streamReader, true))
    {
        var items = new List<Row>();
        var fieldCount = reader.FieldCount; //this is 4 in the test
        var headers = reader.GetFieldHeaders();
        while (reader.ReadNextRecord()) //reader has a size 4 array for the 6 item row
            items.Add(ReadRow(fieldCount, headers, reader));
        data.Items = items;
    }
    return data;
}

private static Row ReadRow(int fieldCount, IList<string> headers, CsvReader reader)
{
    var item = new Row();
    var fields = new List<Field>();
    for (var index = 0; index < fieldCount; index++)
        fields.Add(ReadField(headers, reader, index));
    item.Fields = fields;
    return item;
}

private static Field ReadField(IList<string> headers, CsvReader reader, int index)
{
    return new Field {FieldName = headers[index], FieldValue = NullifyEmptyString(reader, index)};
}

private static string NullifyEmptyString(CsvReader reader, int index)
{
    return string.IsNullOrWhiteSpace(reader[index]) ? null : reader[index];
}

编辑:,自从创建这个问题以来,我已经将CSV解析器更改为使用Microsoft.VisualBasic.FileIO.TextFieldParser。它很容易使用,即使是大文件,性能也很好,并且比Lumenworks更健壮。在处理引用字符串中的换行符时,我遇到了Lumenworks解析器的问题。Microsoft解析器很好地处理了这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-20 01:28:08

尝试使用来自Mike的DataTable csv阅读器(nuget csvtools)。

如果在Read中的任何一个DataTable.New方法中设置了allowMismatch = false,那么如果给定行中的列数不等于预期的列数,则将抛出异常

票数 1
EN

Stack Overflow用户

发布于 2014-09-17 16:29:24

我采用的方法是使用File.ReadAllLines(),然后为每一行分别旋转一个CsvReader,并将列计数与标题行的列计数进行比较。如果有任何带有额外逗号的记录,列计数将更高。就像这样:

代码语言:javascript
复制
var rawRecords = File.ReadAllLines(dataFileName);
foreach (string rawRecord in rawRecords)
{
    using (CsvReader csvRawRecord = new CsvReader(new StringReader(rawRecord), false))
    {
        if (csvRawRecord.FieldCount != fileColumnCount)
        {
            return false;
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-05-20 01:15:50

获取ReadRow中的ReadRow,并根据从标题行传入的FieldCount检查它。如果它更大,那么抛出一个异常。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23741826

复制
相关文章

相似问题

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