CsvHelper 不验证是不是设置了转换

Posted

技术标签:

【中文标题】CsvHelper 不验证是不是设置了转换【英文标题】:CsvHelper not Validating if Conversion is setCsvHelper 不验证是否设置了转换 【发布时间】:2021-12-12 01:12:57 【问题描述】:

使用 CsvHelper 库,如果 Map 定义了转换,则不会触发验证。

例子:

Map(m => m.ProjectStock)
                .Validate(x =>
                    csvMapHelper.TrueStringsList.Contains(x.Field) || csvMapHelper.FalseStringList.Contains(x.Field))
                .Convert(args =>
                
                    var projectStock = args.Row.GetField("ProjectStock");
                    return csvMapHelper.TrueStringsList.Contains(projectStock);
                );

如果我运行此代码,只会触发转换,但会跳过验证。

我做错了什么?

【问题讨论】:

【参考方案1】:

我不确定为什么 Validate 方法不会触发。但是,我相信有一种更简单的方法可以做您想做的事情。

void Main()

    using (var reader = new StringReader("Id,Name,ProjectStock\n1,Jordan,tak\n2,Beth,no"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    
        csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanTrueValues.AddRange(CsvMapHelper.TrueStringsList);
        csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanFalseValues.AddRange(CsvMapHelper.FalseStringList);
        var records = csv.GetRecords<Foo>().ToList();
       


public class Foo

    public int Id  get; set; 
    public string Name  get; set; 
    public bool ProjectStock  get; set; 


public class CsvMapHelper

    public static List<string> TrueStringsList => new List<string>  "yes", "true", "tak" ;
    public static List<string> FalseStringList => new List<string>  "no", "false", "nie" ;    

【讨论】:

以上是关于CsvHelper 不验证是不是设置了转换的主要内容,如果未能解决你的问题,请参考以下文章

向 CsvHelper.Configuration.ClassMap 对象添加验证(字符串)

使用 CsvHelper 将 csv 文件转换为 excel 时减少内存

如何将 EnumConverter 与 CsvHelper 一起使用

编写时在 CsvHelper 中转换或过滤成员

使用CsvHelper写入数据时出现异常

CsvHelper 类型转换,带字符串和整数的列到整数