“ N / A”作为int字段的空值

Col*_* Wu 7 c# csvhelper

我必须使用(即我无法控制)csv文件,其中“ N / A”是“应该”为整数的字段的可能值,并且我一直在尝试找出如何“滚动自己的” TypeConversion类来处理此问题,但未能找到示例。Josh的例子页面在这一特定领域明显缺乏和最近的计算器的问题,我已经能够找到的是这个从2013年。

然后,我找到了对NullValuesAttribute的引用,这似乎正是我所需要的,但是后来却不知道如何使用它。VisualStudio的Intellisense也无济于事。:)

理想情况下,我希望将“ N / A”转换为0(零)。有人可以帮忙吗?

在人们告诉我“好吧,很明显...”之前,我应该说这是我的第一个C#程序(从字面上讲,除了教程),而且还有一个时间因素-否则我会很开心地自己探索。

[更新:在CsvHelper中尝试了顶级自适应解决方案,从String解析布尔值 ]

因此,以上述问题的解决方案为起点,我这样做了:

static void Main()
{
    var rows = new List<Job>();

    using (var reader = new StreamReader("mydatafile.csv")
    using (var csv = new CsvReader(reader))
    {
         csv.Configuration.RegisterClassMap<JobMap>();
         while (csv.Read())
         {
              var record = new Job
              {
                   JobId = csv.GetField<int>("Job ID"),
                   ItemCount = csv.GetField<int>("Item Count")
              };
              rows.Add(record);
         }
    }
}

public class Job
{
    public int JobId { get; set; }
    public int ItemCount { get; set; }
}

public sealed class JobMap : ClassMap<Job>
{
    Map(m => m.JobId);
    Map(m => m.ItemCount).TypeConverterOption.NullValues("N/A");
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,指定NullValues将使TypeConverter将“ N / A”转换为null(因为似乎没有与“ BooleanValues”方法等效的Int32)。

不幸的是,这仍然引发了一个例外:

CsvHelper.TypeConversion.TypeConverterException: 'The conversion cannot be performed.
Text: 'N/A'
MemberType: 
TypeConverter: 'CsvHelper.TypeConversion.Int32Converter''
Run Code Online (Sandbox Code Playgroud)

因此,看起来我将不得不扩展Int32Converter。是?

Met*_*ght 5

您可以像这样定义自定义类型转换器:

using CsvHelper;
using CsvHelper.TypeConversion;
using CsvHelper.Configuration;

public class CustomInt32Converter: Int32Converter {
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        if (text == "N/A") return 0;
        return base.ConvertFromString(text, row, memberMapData);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下行注册您的转换器:

csv.Configuration.TypeConverterCache.AddConverter<int>(new CustomInt32Converter());
Run Code Online (Sandbox Code Playgroud)