Как исправить ConvertException при записи в текстовый файл с библиотекой FileHelpers?

Мне нужно прочитать файл csv, который иногда имеет значения int в полях DateTime из-за ошибки ввода. Но мне все еще нужно сохранить эти значения, чтобы позже записать их в выходной файл.

Пример данных:

  "517506","m","2012-11-07","LTU","4","m","0"
  "517507","m","9","BLR","2","d","0"

Сначала я думал, что проблема в самом чтении, но потом заметил, что получаю эту ошибку

  Unhandled Exception: FileHelpers.ConvertException: Error Converting '9' to type: 'DateTime'.  There are less chars in the Input String than in the Format string: 'yyyy-MM-dd'

когда я пытаюсь преобразовать эти значения int обратно в значение DateTime при записи вывода в файл .txt.

Буду признателен за любую помощь.

Мой код:

    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Citizen>();

        var result = engine2.ReadFile(@"C:\registered_people.csv");
        engine.WriteFile(@"C:\FileOut2.txt", result);
    }

Класс гражданина:

  public class Citizen
{

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    public int? id;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldNullValue("")]
    public string gender;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldNullValue(typeof(DateTime), "")]
    [FieldConverter(ConverterKind.Date, "yyyy-MM-dd")]
    public DateTime birthDate;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldNullValue("")]
    public string nationality;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    public int? countyNo;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldNullValue("")]
    public string familyStat;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    public int? children;

}

person Yokubasu    schedule 25.06.2016    source источник
comment
Прочитайте их как текст и преобразуйте в дату и время, если они имеют правильный формат.   -  person Ian    schedule 25.06.2016
comment
С каких пор 9 является допустимым значением даты? Вот что имеют данные во 2-й записи для BirthDate. Похоже, кто-то закодировал там возраст, когда вам действительно нужна полная дата рождения.   -  person Joel Coehoorn    schedule 27.06.2016


Ответы (1)


У вас есть два варианта:

  1. Прочитайте их как string свойства и преобразуйте их после того, как вы импортируете записи. У вас должно быть два класса: CitizenSpec, который является вашим классом FileHelpers и описывает файл импорта (с общедоступными полями string для предотвращения ошибок преобразования); и Citizen, который является вашим настоящим классом со свойствами, резервными полями, методами, бизнес-логикой и т. д. Затем после engine.ReadFile используйте цикл или Linq для преобразования CitizenSpec записей в Citizen записей.

  2. В качестве альтернативы укажите свой собственный толерантный FieldConverter, который определяет, какие недопустимые входные данные следует игнорировать. См. документацию по пользовательским конвертерам.

person shamp00    schedule 26.06.2016