2011-03-14 33 views
2

私は次のコードスニペットを持っています。これは、世界中の複数の場所から私たちに提供されたCSVファイルをインポートするために使用されます。ファイル形式は同じで、実際にはかなり簡単です。名前、姓、電子メール、いくつかの日付、1つまたは2つのテキスト列です。私が持っている問題は、英語以外の文字、ロシア語、ドイツ語、スペイン語の文字が正しくインポートされていないことです。 DataTableのファイルの内容を見ると、「Андрей」などが生成されるべきときは「ÐнÐ'Ñ€Ðμй」のようになります。私は非常に長い時間を探していて、解決策を見つけることができないようです。ファイルをxlsに保存してからインポートした場合、接続文字列を変更すると正常に動作するため、ジェットエンジンがユニコード文字を処理できるように見えます。どんな助けもありがとう。それが重要な場合私は窓7 64ビットでVS 2010を使用しています。前もって感謝します!OLE CSVでのUnicode文字のインポート

string filename = @"C:\Data\Test.csv"; 
    string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data;Extended Properties=""text;CharacterSet=UNICODE;HDR=Yes;FMT=Delimited"";"; 
    string commString = string.Format("Select * from {0}", filename); 

    DataTable dt = new DataTable(); 
    using (OleDbConnection connection = new OleDbConnection(connString)) 
    { 
    connection.Open(); 
    using (OleDbDataAdapter da = new OleDbDataAdapter(commString, connection)) 
    { 
     da.Fill(dt); 
    } 
    } 
+0

私はパスの変更を除いて書かれたようにあなたのサンプルコードを試してみました。私はメモ帳でtest.csvファイルを作成し、サンプル値をコピーしてUnicodeとして保存しました。私はデバッガでデータテーブルを見て、値が正しいように見えました。だからこそこれはあなたを少しでも助けませんが、それは "それが世界の少なくとも一つのマシンで働いていた"ことを知っていることを奨励するかもしれません。私も64ビットwin7です。私は現時点でVS2005を開いてそこに走らせてしまったが、違いが生じるのではないかと疑う。 –

答えて

2

Microsoft製品は、(私の唯一の経験はエクセルである)最初の2または3ファイルのバイト(UTF-8用)(UTF-16 *用)として、バイトオーダーマーク(BOM)が必要です。ファイルをExcelから「Unicode Text」として保存すると、FF FEを最初の2バイトとして埋め込み、残りのデータはUTF-16LEとしてエンコードされていることがわかります。そして、同様のへの保存オプションメモ帳:

Notepad Encoding  BOM  Character Encoding 
------------------- --------- -------------------- 
Unicode    FF FE  UTF-16LE 
Unicode Big Endian FE FF  UTF-16BE 
Utf8     EF BB BF UTF-8 

だからバイトオーダーマークがありますかどうかを確認するためにバイナリエディタか何かでCSVファイルを確認してください。私はそれが欠落し、データにまっすぐに入ると思う。あなたのUTF-8文字列の生のバイトBecuase窓-1252として解釈されている

UTF-8 String: Андрей 
Bytes:   D0 90 D0 BD D0 B4 D1 80 D0 B5 D0 B9 
Windows-1252: Ð<ERR>ндрей 
Where <ERR> is because x90 is not a valid windows-1252 byte 

http://sodved.awardspace.info/unicode.pl

二つの選択肢を残すということ:あなたが知っている場合

  • 何のエンコーディングファイルは(あなたのシャプトームからUTF-8のように見えます)、次にファイル処理に指定できるかどうかを確認します。それ
  • はUTF-8用の接続文字列内の

    キャラクタ= 65001

    を試してみてください

+0

私は、CSVファイルのシンボルが変更されているため、正規表現のマッチングが行われないという問題が発生しています。私は非常にうんざりされていました。私は16進数の編集ファイルを始めました。ありがとうございます - これはすばらしい投稿であり、潜在的な問題について私に啓発しています。今、特定のエンコーディングを期待するためにpowershellのimport-csv関数を得ることができるかどうかを知るために! – Larold

+0

心配はいりません。残念なことに、この方法を学ぶための唯一の方法はハードな方法だと思います。確かに(私はまだありますが) – Sodved

0

を処理する前に、データへのバイト順序を追加するために、多くの場合、いくつかのパラメータまたはオプションがあります。

string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data;Extended Properties=""text;characterset=65001;HDR=Yes;FMT=Delimited"";"; 

他のコードについては、linkに従ってください。