Leia Csv erro de codificação de arquivo
-
10-07-2019 - |
Pergunta
Eu estou usando o método a seguir para ler o conteúdo do arquivo 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;
}
}
Este método funciona se eu tiver um UTF-8 arquivo CSV codificado com um schema.ini , que é algo como isto:
[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI
Se eu tiver caracteres alemães em um arquivo CSV com Unicode codificação, o método não pode ler os dados corretamente.
Que modificações posso fazer com o método acima para ler Unicode arquivos CSV? Se não houver nenhuma maneira de fazê-lo desta maneira, o código CSV leitura pode sugerir?
Solução
Tente usar CharacterSet=UNICODE
em seu arquivo schema.ini. Embora este não é documentado no MSDN funciona de acordo com este linha no Microsoft Fóruns .
Outras dicas
Bem, um muito bom e bem utilizado leitor CSV streaming de está em CodeProject ; que é a primeira coisa que eu tentaria ... mas parece que a codificação pode ser borked, que pode não torná-lo simples ... é claro, pode ser apenas ODBC que está quebrando, no caso do trabalho poder acima do qual bem.
Para simples CSV Você poderia tentar analisá-lo você mesmo (string.Split
etc), mas existem suficientes borda casos que um analisador de pré-rolou vale a pena usar.