【问题标题】:CSVHelper Inline Convert issueCSVHelper 内联转换问题
【发布时间】:2019-04-25 16:51:13
【问题描述】:

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

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

        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");

类字段是

公共时间跨度到达时间{获取;放; } 公共时间跨度离开时间{得到;放; }

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

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

希望有正确的语法来推动我的努力。

提前谢谢大家,

史蒂夫

【问题讨论】:

  • 如果您的 CSV 有一个字符串是 Timespan 并且您的类属性是 Timespan,您不需要做任何事情。 CsvHelper 将使用TimeSpanConverter 为您转换它。 CsvHelper 已经为 intDateTimeTimeSpan 等类注册了默认转换器。如果你想改变默认转换器,你可以使用.TypeConverter<TimeSpanConverter>()

标签: c# inline converters csvhelper


【解决方案1】:

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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多