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;
}
}
この方法は、次のような schema.ini で UTF-8 エンコードされたCsvファイルがある場合に機能します。
[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI
Unicode エンコードのCsvファイルにドイツ語の文字がある場合、メソッドはデータを正しく読み取ることができません。
上記の方法で Unicode Csvファイルを読み取るためにどのような変更を加えることができますか?この方法でそれを行う方法がない場合、どのCsv読み取りコードを提案できますか?
解決
schema.iniファイルで CharacterSet = UNICODE
を使用してみてください。これは MSDNに文書化されていませんが、この Microsoftフォーラムのスレッド。
他のヒント
まあ、非常に優れたよく使用されるストリーミングCSVリーダー CodeProjectにあります;それは私が最初に試みることです...しかし、あなたのエンコーディングが中断されているように聞こえます、それはそれを単純にしないかもしれません...もちろん、それは壊れているodbcである可能性があり、その場合、上記がうまくいくかもしれません罰金。
単純なCSVの場合は、自分で解析してみることができます( string.Split
など)が、事前にロールされたパーサーを使用するだけの十分なエッジケースがあります。
所属していません StackOverflow