2016-06-10 78 views
1

我正在編寫一個應該幫助進行計算的程序,這取決於用戶導入的文件(csv輸入文件)。文化信息輸入文件c#

對於計算是正確的我強制該計劃已與文化「en-US」運作。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); 

我讀的輸入文件的方式

using (StreamReader sr = new StreamReader("C:\\data.csv")) 
      { 
       while ((currentLine = sr.ReadLine()) != null) 
       { 
        var values = currentLine.Split(';'); 

         string a = values[0]; 
         string b = values[1]; 
         string c = values[2]; 
         string d = values[3]; 
         string e = values[4]; 
         string f = values[5]; 
         string g = values[6]; 
         string h = values[7]; 
         string i = values[8]; 
         string j = values[9]; 
         string k = values[10]; 
        } 
       } 

我擔心的是我不知道輸入文件的語言記錄,也許這是一種文化「FR - FR」和我有確保數據分隔符,小數部分的語言「en-US」。您能否向我解釋如何確定輸入文件的語言或如何將其轉換爲與語言「en-US」兼容

+0

考慮文件的來源。你可以在創建文件時做任何事情,比如將文化包含在文件名中或作爲第一行? –

+0

我不能,用戶用Excel製作文件。它對他完全透明 –

回答

0

我找到了解決方案。我的輸入文件是一個帶有第一個標題行的10列文件。用戶必須在第一行寫:

LABEL1 LABEL2等等......直到10

所以,我使用的功能「之間」找到的分隔符。

test是使用StreamReader讀取文件的第一行。我將第一行存儲到一個字符串中。

Console.WriteLine(test.Between("LABEL1", "LABEL2")); 

現在,我知道這是否是「;」分隔符我會用「。」替換每個「,」。如果分隔符是「,」我不必更換任何小數分隔符,因爲它已經是「。」等等任何分隔符...

關注

+0

例如,您必須小心這種轉換,而不是用逗號替換點,對於數字,您可以指定用於解析字符串的區域性。等於1000,因爲Excel可以在csv文件中添加數千個分隔符(https://en.wikipedia.org/wiki/Decimal_mark#Digit_grouping) –

1

首先,CSV格式與文化沒有嚴格關係。常見的分隔符(;,),分隔符(")與文化無關,即使某些工具(如Excel)使用,作爲en-US版本(可以隨時更改)和;作爲fr-FR。

最好的方法是使用這些文件來建立合同(「庫處理CSV文件的格式如下:」),或者採取一些配置來正確處理文件。否則,您將不得不通過解析標題和內容來嘗試啓發式方法(如果您有固定數量的列,您可能可以猜出分隔符),但它有限制。

這是試圖找出什麼編碼的文件中使用(你也可能有問題,CSV文件可以與UTF-8ANSI例如編碼)的時候,人們可以遇到同樣的問題。 (順便說一句,Excel是一個可怕的工具來處理CSV文件,它截斷數據和其他奇怪的東西。訪問處理CSV文件更好,但人們傾向於使用Excel)。

+0

是的輸入文件有10列和X行。如果我用輸入文件的內容製作一個帶有文本塊的窗口。和一個文本框進入列分隔符,之後,我可以定義小數分隔符(如果用戶輸入「;」作爲列分隔符每隔,是一個小數點分隔符,我必須用「。」替換每個「,」並刪除「」? –