2016-06-25 5 views
0

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

данных:

"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' 

, когда я пытаюсь преобразовать те ИНТ значения Возврат к значению 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); 
    } 

Citizen Класс:

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; 

} 
+1

Прочитайте их как текст и преобразуйте их в datetime, если они имеют правильный формат. – Ian

+0

С каких это "9" допустимое значение даты? Это то, что данные имеют во 2-й записи для «BirthDate». Похоже, кто-то закодировал возраст там, когда вам действительно нужна полная дата рождения. –

ответ

0

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

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

  2. В качестве альтернативы укажите свой толерантный FieldConverter, который определяет, какие недопустимые входы игнорируются. См. the documentation on custom converters.

 Смежные вопросы

  • Нет связанных вопросов^_^