首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSVHelper强制字段

CSVHelper强制字段
EN

Stack Overflow用户
提问于 2014-11-03 11:06:17
回答 4查看 7.7K关注 0票数 6

在解析csv文件时,如何定义特定字段是强制的。本质上,我希望确保给定的字段永远不会是空的,如果是,那么我希望抛出一个异常。下面是映射类:

代码语言:javascript
复制
public sealed class DataMapper : CsvClassMap<DataType>
{
    public DataMapper()
    {
        Map(m => m.Field1).Name("FirstField");
        Map(m => m.Field2).Name("SecondField");
        Map(m => m.Field3).Name("ThirdField"); // this field should be mandatory
    }
}

以及使用情况:

代码语言:javascript
复制
List<DataType> data;
using (var sr = new StreamReader(localFilePath))
{
    var reader = new CsvReader(sr);
    reader.Configuration.RegisterClassMap<DataMapper>();
    data = reader.GetRecords<DataType>().ToList();
}

目前,我正在检查数据列表中的结果如下:

代码语言:javascript
复制
var numberOfInvalidRecords = data.Count(data => string.IsNullOrEmpty(data.Field3));
if (nullAccountHolderRecords > 0)
{
    //handle
}

我无法在CSVHelper文档中找到内置特性。我是不是遗漏了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-03 11:20:31

我可能会使用ConvertUsing扩展来完成这个任务:

代码语言:javascript
复制
public sealed class DataMapper : CsvClassMap<DataType>
{
    public DataMapper()
    {
        Map(m => m.Field1).Name("FirstField");
        Map(m => m.Field2).Name("SecondField");
        Map(m => m.Field3).ConvertUsing(row =>
        {
            if(string.IsNullOrEmpty(row.GetField<string>("ThirdField")))
                throw new Exception("Oops, ThirdField is empty!");
            return row.GetField<string>("ThirdField");
        });
    }
}
票数 5
EN

Stack Overflow用户

发布于 2017-06-08 04:45:23

下面是扩展API的解决方案:

代码语言:javascript
复制
public static class CsvHelperExtensions
{
    public static CsvPropertyMap Required<T>(this CsvPropertyMap map, string columnName)
    {
        return map.Name(columnName).ConvertUsing(row =>
        {
            if (string.IsNullOrEmpty(row.GetField(columnName)))
                throw new CsvParserException($"{columnName} is required, but missing from row {row.Row}");
            return row.GetField<T>(columnName);
        });
    }
}

用法:

代码语言:javascript
复制
public CsvPersonMap()
{
    Map(m => m.FirstName).Required<string>("First");
    Map(m => m.LastName).Name("Last");
    Map(m => m.MiddleName).Required<string>("Middle");
}
票数 5
EN

Stack Overflow用户

发布于 2019-09-11 15:49:19

开发人员现在添加了一个验证方法:https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/validation

使用此方法对非空字符串或空字符串进行验证:

Map(m => m.Id).Validate(field => !string.IsNullOrEmpty(field));

https://github.com/JoshClose/CsvHelper/issues/556

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

https://stackoverflow.com/questions/26712912

复制
相关文章

相似问题

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