2011-08-10 66 views
0

這裏是我想從一個CSV導入包含在一個領域擁有超過一個值的CSV文件

Time|Person|Products|Address 

(now)|person1|val1*val2*val3|adr1 

其中*是斷行/回車

導入數據下面是我導入時的樣子:

(now)|person1|val1val2val3|adr1 

這是我需要它看起來像:

(now)|person1|val1|adr1 

(now)|person1|val2|adr1 etc. 

我已經試過:自定義編碼主要圍繞string.Spilt()基於CSV分析器,它給我確切的結果,永遠走上過程。我試過Sebastien Lorion的CSVReader,它給了我完全相同的結果,雖然它明顯更快,更容易插入到我現有的代碼中。我甚至用完全相同的結果嘗試了VB TextFieldParser

現在,這裏就是我想這樣做:

某種方式傳遞字段的值(我不知道如何引用它們)當我把它到達它通過它返回一個List<string>對象的另一種方法我可以迭代並添加到DataTable,並從那裏做需要做的事情。用舊叉子取出我的腦幹。在我的呼吸下踱步。

下面是使用TextFieldParser代碼:

OpenFileDialog op = new OpenFileDialog(); 
op.ShowDialog(); 
TextFieldParser parser = new TextFieldParser(new StreamReader(op.FileName)); 
parser.SetDelimiters(","); 

while (!parser.EndOfData) 
{ 
    contents.AddRange(parser.ReadFields()); 
} 

回答

1

在我看來,如果你必須堅持使用這種CSV格式,那麼我會像上面一樣閱讀它;但之後,我會循環訪問您的數據收集,然後手動將產品分割成您需要的組件。

試圖在一個過程中做到所有這一切都過分複雜化的問題。

一旦你得到了你的獨立的類,你可以再拆的產品。回車像這樣:

string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries); 
+0

你是對的,但確實我怎麼分割值。每個產品的字符串長度都不相同,所以我不能通過索引來做到這一點,沒有模式可以區分一種產品,所以我不能使用正則表達式? – Dani

+0

我已經更新了我的答案,該代碼段將在新行上打斷一個字符串。然後,您可以通過結果添加新行項目來複制當前行項目中的時間,人員和地址並添加新的產品類型。 –

+0

非常感謝Russ – Dani

0

看一看的FileHelpers庫。它非常快速而且非常靈活。雖然我認爲你將不得不爲你想做的事情寫一點定製處理邏輯。

相關問題