Ошибка импорта файла CSV с помощью FileHelpers - PullRequest
12 голосов
/ 22 апреля 2011

Я использую библиотеку FileHelpers для импорта CSV-файлов в таблицу базы данных.У меня проблема с импортом файла, поле которого начинается с цифры ('800NUMBER') в заголовке файла.

Код для импорта: DataTable data = CommonEngine.CsvToDataTable(file, ',');

Исключение: FileHelpers.FileHelpersException: The string '800NUMBER' not is a valid .NET identifier. at FileHelpers.RunTime.FieldBuilder..ctor(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.CsvClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName) at FileHelpers.RunTime.CsvClassBuilder..ctor(CsvOptions options) at FileHelpers.CsvEngine.CsvToDataTable(String filename, String classname, Char delimiter, Boolean hasHeader) at FileHelpers.CommonEngine.CsvToDataTable(String filename, Char delimiter)

Я не уверен, есть ли способ избежать имени столбца, например «[800NUMBER]».

Имя столбца не может быть изменено, потому что именно так клиент предоставляет его нам.

Спасибо,-Олег


Решил эту проблему, прочитав строку «заголовок» отдельно от строк «данные».Затем я изменяю имена столбцов в «data» и использую SqlBulkCopy для импорта в базу данных.

    FileHelpers.CsvOptions options = new FileHelpers.CsvOptions("ImportRecord", ',', file);
    options.HeaderLines = 0;        

    FileHelpers.CsvEngine engine = new FileHelpers.CsvEngine(options);

    engine.Options.IgnoreFirstLines = 0; 
    DataTable header = engine.ReadStringAsDT(FileHelpers.CommonEngine.RawReadFirstLines(file, 1)); 

    engine.Options.IgnoreFirstLines = 1;
    DataTable data = engine.ReadFileAsDT(file); 

    for (int i = 0; i < header.Columns.Count; i++)
        data.Columns[i].ColumnName = header.Rows[0][i].ToString();

1 Ответ

2 голосов
/ 22 апреля 2011

Глядя на источник FileHelpers, вы ничего не можете с этим поделать, кроме как изменить имя столбца. Однако вы можете довольно легко изменить FileHelpers, чтобы украсить имя поля CSV перед созданием полей C #.

Конечно, CSV - не самый сложный формат в мире - , если вы знаете, что вам не нужно иметь дело с экранированными запятыми , тогда String.Split(',', myLine) часто в значительной степени все тебе нужно. Лично я сомневаюсь, что я бы представил проблему сторонней зависимости только для чтения CSV-файлов.

...