阅读时如何忽略CSV中的空行

btxsgosb  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(154)

尝试使用CsvHelper.GetRecords<T>()读取具有空行(通常在末尾)的CSV文件。
如果没有空行,这就很好,但是如果CSV文件有空行(定义为、、、、、),它就会抛出TypeConverterException

Text: ''
MemberType: IntelligentEditing.PerfectIt.Core.DataTypes.Styles.StyleRuleType
TypeConverter: 'CsvHelper.TypeConversion.EnumConverter'

我已经阅读了文档(https://joshclose.github.io/CsvHelper/api/CsvHelper.Configuration/Configuration/),并尝试将配置对象设置为IgnoreBlankLines = true,但没有成功。
简化示例:

public enum ItemTypeEnum
{
    Unknown = 0,
    Accounts = 1,
    HR = 2,
}

public class CsvItemDto
{
    public int Id { get; set; }

    public string Value { get; set; }

    public ItemTypeEnum ItemType { get; set; }
}

.
.
.
var configuration = new Configuration()
{
    HasHeaderRecord = true,
    HeaderValidated = null,
    MissingFieldFound = null,
    IgnoreBlankLines = true,

};
var csv = new CsvReader(textReader, configuration);
var rows = csv.GetRecords<CsvItemDto>();

if (rows != null)
{
    var items = rows.ToList();
    //Throws exception here
}

CSV通常包含如下内容:

Id,Value,ItemType
1,This,Unknown
2,That,Accounts
3,Other,HR
,,
,,

我期望IgnoreBlankLines忽略CSV中的空行,但它没有。有什么想法吗?

pepwfjgg

pepwfjgg1#

@phat.huynh的想法是正确的,只要告诉它跳过任何字段都是空字符串的记录。

var configuration = new Configuration()
{
    HasHeaderRecord = true,
    HeaderValidated = null,
    MissingFieldFound = null,
    ShouldSkipRecord = record => record.All(field => String.IsNullOrWhiteSpace(field))
};
vpfxa7rd

vpfxa7rd2#

除了@大卫Specht的回答,新版本更新了delegate ShouldSkipRecord。我使用的是28.0.1版本,下面的代码对我有效。

ShouldSkipRecord = args => args.Row.Parser.Record.All(string.IsNullOrWhiteSpace)
gdx19jrr

gdx19jrr3#

您可以尝试在配置上实现ShouldSkipRecord以选择跳过或不跳过

var configuration = new Configuration () {
                HasHeaderRecord = true,
                HeaderValidated = null,
                MissingFieldFound = null,
                IgnoreBlankLines = true,
                ShouldSkipRecord = (records) =>
                {
                    // Implement logic here
                    return false;
                }
            };
4szc88ey

4szc88ey4#

CsvHelper 23.0.0中,另一种方法是管理读取器异常

var conf = new CsvConfiguration(new CultureInfo("en-US"));
conf.ReadingExceptionOccurred = (exc) =>
{
    Console.WriteLine("Error");
    return false;
};

我们可以记录它,抛出它,绕过它返回false,甚至通过查看异常源来区分行为。

相关问题