Lesen Sie CSV-Datei Codierungsfehler
-
10-07-2019 - |
Frage
Ich bin mit dem folgende Verfahren zum Lesen csv-Datei Inhalt:
/// <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;
}
}
Diese Methode funktioniert, wenn ich eine UTF-8 haben codierte Csv mit einer Datei schema.ini , die etwa wie folgt aussieht:
[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI
Wenn ich deutsche Zeichen in einem CSV-Datei Unicode Codierung, wobei das Verfahren kann die Daten nicht richtig gelesen.
Welche Änderungen kann ich auf das obige Verfahren machen lesen Unicode CSV-Dateien? Wenn es keine Möglichkeit, es auf diese Weise zu tun, was Csv-Lesecode können Sie vorschlagen?
Lösung
Versuchen CharacterSet=UNICODE
in Ihrer schema.ini Datei. Obwohl dies nicht es nach funktioniert das Thread auf Microsoft Foren .
Andere Tipps
Nun, ein sehr guter und gut genutzt Streaming CSV-Reader ist auf Codeproject ; das ist das erste, was ich versuchen würde ... aber es klingt wie Ihre Codierung borked werden, was es nicht einfach machen könnte ... natürlich, es könnte nur odbc sein, dass die oben in dem Fall könnte bricht, arbeitet in Ordnung.
Für einfache CSV könnten Sie versuchen, es selbst Parsen (string.Split
usw.), aber es gibt genug kanten Fälle, dass ein vorgewalzte Parser wert verwendet wird.