CSVHelper内联转换问题

时间:2019-04-25 16:51:13

标签: c# inline converters csvhelper

尝试将GTFS导入我的自定义类型。 C#字段是TimeSpan,我正尝试使用内联TimeSpanConverter并缺少某些内容。我不需要花哨的JSON示例示例。只是需要知道如何在线使用转换器。

我研究了一下,寻找了例子,尝试了一个继承自TimeSpanConverter的类。只是对于导入时到TimeSpan的简单内联字符串(08:00:00)而言,还没有为jason complexe数据类型做好准备

        var timeSpanConverter = new CsvHelper.TypeConversion.TimeSpanConverter();


        Map(m => m.trip_id).Name("trip_id");
        Map(m => m.arrival_time).Name("arrival_time").ConvertUsing(timeSpanConverter.ConvertFromString());

        Map(m => m.departure_time).Name("departure_time");

Class字段是

公共TimeSpan到达时间{get;组; }         公开的TimeSpan出发时间{组; }

失败的行是  Map(m => m.arrival_time).Name(“ arrival_time”)。ConvertUsing(timeSpanConverter.ConvertFromString());

错误是: SCS7036没有给出与“ TimeSpanConverter.ConvertFromString(string,IReaderRow,MemberMapData)”的所需形式参数“ text”相对应的参数。

希望使用正确的语法来继续前进。

谢谢大家

史蒂夫

1 个答案:

答案 0 :(得分:0)

CsvHelper已为要转换为的大多数类型(包括TimeSpan)注册了默认转换器。如果您对默认设置感到满意,则无需执行任何操作。

public static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader))
    {
        writer.WriteLine("trip_id,arrival_time,departure_time");
        writer.WriteLine("101,08:00:00,09:00:00");
        writer.Flush();
        stream.Position = 0;

        var records = csv.GetRecords<Foo>().ToList();

        Console.ReadKey();
    }
}

public class Foo
{
    public int trip_id { get; set; }
    public TimeSpan arrival_time { get; set; }
    public TimeSpan departure_time { get; set; }
}

如果您想做一些超出默认值的事情,则可以创建自己的转换器并使用它。

public static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader))
    {
        writer.WriteLine("trip_id,arrival_time,departure_time");
        writer.WriteLine("101,08:00:00,09:00:00");
        writer.Flush();
        stream.Position = 0;

        csv.Configuration.RegisterClassMap<FooMap>();
        var records = csv.GetRecords<Foo>().ToList();

        Console.ReadKey();
    }
}

public class Add30SecondsConverter : TimeSpanConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        var timespan = (TimeSpan)base.ConvertFromString(text, row, memberMapData);

        return timespan.Add(new TimeSpan(0, 0, 30));
    }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.trip_id);
        Map(m => m.arrival_time).TypeConverter<Add30SecondsConverter>();
        Map(m => m.departure_time);
    }
}

public class Foo
{
    public int trip_id { get; set; }
    public TimeSpan arrival_time { get; set; }
    public TimeSpan departure_time { get; set; }
}