CSVHelper Inline Convert выпуск - PullRequest
       17

CSVHelper Inline Convert выпуск

0 голосов
/ 25 апреля 2019

Попытка импортировать GTFS в мой пользовательский тип. Поле C # - TimeSpan, и я пытаюсь использовать встроенный TimeSpanConverter, и мне чего-то не хватает. Мне не нужны причудливые примеры примеров JSON. Просто нужно знать, как использовать конвертер inline.

Я исследовал, искал примеры, пробовал класс с наследованием от 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");

Поля класса

public TimeSpan прибытие_ время {получить; задавать; } public TimeSpan задавать; }

Ошибка строки Карта (m => m.arrival_time) .Name («время прибытия»). ConvertUsing (timeSpanConverter.ConvertFromString ());

ошибка: SCS7036 Не указан аргумент, который соответствует обязательному формальному параметру 'text' для TimeSpanConverter.ConvertFromString (string, IReaderRow, MemberMapData) '

надеюсь, что у меня будет правильный синтаксис для продвижения вперед.

Спасибо всем заранее,

Steve

1 Ответ

0 голосов
/ 26 апреля 2019

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