Csv Helper Fluent Class Mapping добавляет начальный ноль в поле int при сопоставлении со строковым свойством

У меня есть строковое свойство TimeClockCode. Который сопоставляется с индексом (0) файла csv. Index(0) содержит целые числа, такие как 11565. Но после сопоставления со строкой TimeClockCode,

Вот так: Map(p => p.TimeclockCode).Index(0);

или вот так: Map(p => p.TimeclockCode).ConvertUsing(row => row.GetField<string>(0));

оба приводят к строке 011565.

Я решил это, прочитав его как int и вызвав для него toString.

Map(p => p.TimeclockCode).ConvertUsing(row => row.GetField<int>(0).ToString()); Что дало мне желаемые результаты 11565.

Я что-то упустил в реализации плавных отображений? Откуда берется ведущий ноль?


person Daniel Orlan    schedule 07.04.2016    source источник
comment
Как TimeclockCode определен в классе? Я просматриваю документацию и не вижу ничего плохого в том, чем вы поделились.   -  person Siderite Zackwehdex    schedule 07.04.2016
comment
Вы уверены, что строка CSV не содержит строку 011565? Как это выглядит? Я попытаюсь воссоздать это в коде.   -  person Siderite Zackwehdex    schedule 07.04.2016
comment
Строка содержит только 11565. При сопоставлении ее со строковым свойством добавляется 0, если я не вытаскиваю ее как int, а затем вызываю для нее toString(). Похоже, что .Index() читает его как int, затем пытается преобразовать его в строку для сопоставления с моим свойством, и где-то добавляется 0.   -  person Daniel Orlan    schedule 08.04.2016
comment
Можете ли вы воссоздать небольшой пример этого? Или, по крайней мере, опубликуйте строку CSV, которая не работает.   -  person Josh Close    schedule 08.04.2016


Ответы (1)


Я не смог воспроизвести вашу проблему. Я использовал этот код:

static void Main(string[] args)
{
    var s = "\"11565\",\"a\",\"012\",\"4.5\",\"01\",\"555\"\r\n";
    using (var sr = new StringReader(s))
    {
        var csv = new CsvReader(sr);
        csv.Configuration.HasHeaderRecord = false;
        csv.Configuration.RegisterClassMap<MyClassMap>();
        while (csv.Read())
        {
            var record = csv.GetRecord<MyClass>();

        }
    }
}

public class MyClass
{
    public string Test { get; set; }
    public string TimeclockCode { get; set; }
}

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map(p => p.TimeclockCode).Index(0);
        Map(p => p.Test).Index(2);
    }
}

Я могу только предположить, что значение в CSV равно 011565 или что у вас есть какая-то другая проблема, не очевидная из текста вопроса.

person Siderite Zackwehdex    schedule 07.04.2016
comment
Что еще более странно, помещая ваш код в результаты теста true, если я проверяю его на int и строку FakeReader r = new FakeReader(); var arr = r.ResultList.ToArray(); arr[0].TimeclockCode.ShouldBeEquivalentTo(11565); arr[0].TimeclockCode.ShouldBeEquivalentTo("11565"); }, оба теста зеленые - person Daniel Orlan; 08.04.2016
comment
Но как насчет стоимости? Это 011565 или просто 11565? Чем мой код отличается от вашего? - person Siderite Zackwehdex; 08.04.2016
comment
Я открыл файл в блокноте и увидел, что значение на самом деле 011565, excel скрывал нули. Однако почему row.GetField<int>(0).ToString() отбрасывает начальный нуль? - person Daniel Orlan; 19.04.2016
comment
Потому что GetField берет значение 011565 и превращает его в целое число (потому что вы просили об этом), а затем превращает его в строку, таким образом, становится 11565. - person Siderite Zackwehdex; 19.04.2016