Ошибка чтения файла CSV
-
10-07-2019 - |
Вопрос
Я использую следующий метод для чтения содержимого файла CSV:
/// <summary>
/// Reads data from a CSV file to a datatable
/// </summary>
/// <param name="filePath">Path to the CSV file</param>
/// <returns>Datatable filled with data read from the CSV file</returns>
public DataTable ReadCsv(string filePath)
{
if (string.IsNullOrEmpty(filePath))
{
log.Error("Invalid CSV file name.");
return null;
}
try
{
DataTable dt = new DataTable();
string folder = FileMngr.Instance.ExtractFileDir(filePath);
string fileName = FileMngr.Instance.ExtractFileName(filePath);
string connectionString =
string.Concat(@"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=",
folder, ";");
using (OdbcConnection conn =
new System.Data.Odbc.OdbcConnection(connectionString))
{
string selectCommand = string.Concat("select * from [", fileName, "]");
using (OdbcDataAdapter da = new OdbcDataAdapter(selectCommand, conn))
{
da.Fill(dt);
}
}
return dt;
}
catch (Exception ex)
{
log.Error("Error loading CSV content", ex);
return null;
}
}
Этот метод работает, если у меня есть CSV-файл в кодировке UTF-8 с schema.ini , который выглядит примерно так:
[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI
Если у меня есть немецкие символы в CSV-файле с кодировкой Unicode , метод не может правильно прочитать данные. Р>
Какие изменения можно внести в приведенный выше метод для чтения Unicode CSV-файлов? Если нет способа сделать это таким образом, какой код для чтения CSV вы можете предложить?
Решение
Попробуйте использовать CharacterSet = UNICODE
в своем файле schema.ini. Хотя это не документировано в MSDN , оно работает в соответствии с этим на форумах Microsoft .
Другие советы
Что ж, очень хороший и хорошо используемый потоковый CSV-ридер есть в CodeProject а>; это первое, что я попробую ... но звучит так, будто ваша кодировка может быть сорвана, что не может сделать ее простой ... конечно, это может быть просто odbc, который ломается, и в этом случае вышеприведенное может работать хорошо. р>
Для простого CSV вы можете попытаться разобрать его самостоятельно ( string.Split
и т. д.), но есть достаточно крайних случаев, которые стоит использовать для предварительно свернутого парсера.