Erreur de codage de fichier Csv
-
10-07-2019 - |
Question
J'utilise la méthode suivante pour lire le contenu d'un fichier 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;
}
}
Cette méthode fonctionne si j'ai un fichier Csv codé UTF-8 avec un schema.ini qui ressemble à ceci:
[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI
Si j'ai des caractères allemands dans un fichier Csv avec le codage Unicode , la méthode ne peut pas lire les données correctement.
Quelles modifications puis-je apporter à la méthode ci-dessus pour lire les fichiers Csv Unicode ? S'il n'y a aucun moyen de le faire de cette façon, quel code de lecture en Csv pouvez-vous suggérer?
La solution
Essayez d’utiliser CharacterSet = UNICODE
dans votre fichier schema.ini. Bien que cela ne soit pas documenté sur MSDN , cela fonctionne comme suit sur les forums Microsoft .
Autres conseils
Eh bien, un très bon et bien utilisé lecteur de flux de diffusion CSV se trouve sur CodeProject ; c’est la première chose que j’essayerais… mais il semblerait que votre encodage risque d’être bouleversé, ce qui ne simplifiera peut-être pas la tâche… bien sûr, c’est peut-être tout simplement odbc qui se casse, auquel cas cela pourrait fonctionner bien.
Pour un fichier CSV simple, vous pouvez essayer de l’analyser vous-même ( string.Split
etc.), mais il existe suffisamment de cas de contours qu’un analyseur syntaxique de ce type mérite d’être utilisé.