2011-03-14 54 views
2

我有以下代碼片段。這用於導入從世界各地的多個位置提供給我們的CSV文件。文件格式相同,實際上非常簡單,名字,姓氏,電子郵件和一些日期以及一到兩個其他文本列。我遇到的問題是一些非英文字符,俄語,德語,西班牙字符沒有正確導入。當我查看它產生的DataTable中的文件內容時,例如「ÐнÐ'Ñ€Ðμй」,當它產生「Андрей」等。我尋找了很長時間,似乎找不到解決辦法。如果我將文件保存到xls然後導入它,改變我的連接字符串當然它工作正常,所以它似乎像噴氣引擎可以處理unicode字符。任何幫助,將不勝感激。如果有關係我在Windows 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

微軟產品(我唯一的經驗是用Excel)需要一個字節順序標記(BOM)作爲第2(對於UTF-16 *)或3(爲UTF-8)文件中的字節。當您將文件從excel保存爲「Unicode文本」時,您可以看到它將FF FE作爲前兩個字節嵌入,其餘數據編碼爲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字符串的原始字節被解釋爲窗口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

,將讓你有兩種選擇:

  • 如果你知道的編碼這些文件是(從你的syptoms看起來像UTF-8),然後看看你是否可以指定它到文件處理。經常有一些參數或選項爲它
  • 添加的字節順序到數據處理
+0

我遇到了一個問題,即CSV文件中的符號被修改,從而避免了我的正則表達式匹配。我非常慌張,我開始編輯文件,並且看到上面提到的一些標籤。謝謝 - 這是一篇非常棒的文章,並啓發了我潛在的問題。現在要弄清楚我是否可以獲得powershell的import-csv函數來期待特定的編碼! – Larold

+0

不用擔心。不幸的是,困難的方式似乎是學習這些東西的唯一方式 - 對我來說當然是(現在也是) – Sodved

0

之前嘗試

字符集= 65001

您的連接字符串中

爲UTF-8 。

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

按照link獲取其他代碼。