2012-11-15 237 views
3

我們已經與另一個系統進行了整合,這個系統依賴於來回傳遞CSV文件(真的是老派)。解析CSV文件

的結構通常爲:

ID, Name, PhoneNumber, comments, fathersname 
1, tom, 555-1234, just some random text, bill 
2, jill smith, 555-4234, other random text, richard 

每隔一段時間我們看到:

3, jacked up, 999-1231, here 
be dragons 
amongst us, ted 

主要問題我關心的是檢測到線斷路器(\n)中的過程中發生記錄什麼時候是記錄終止者。

有無論如何我可以預處理這個可靠地解決它?

請注意,我們有零控制超過其他系統發出的。

+0

那裏有很多CSV閱讀器..我過去成功地使用了這個。它真的很快。 http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader 您可以設置規則並對其進行調整。 – 2012-11-15 22:06:09

+2

查找編寫代碼以生成無效格式並對其進行打擊的人,然後讓您的代碼拋出新的FormatException();'。我不認爲大多數格式化人員能夠處理這個問題,沒有引用這個領域的話;你需要推出自己的。 – Servy

+0

我想你可以指望nr。的未轉義的'','換行符的字符,如果它是0而不是實際上是新的記錄。 – Magnus

回答

1

所以,你應該能夠做一些事情或多或少是這樣的:

for (int i = 0; i < lines.Count; i++) 
{ 
    var fields = lines[i].Split(',').ToList(); 
    while (fields.Count < numFields)//here be dragons amonst us 
    { 
     i++;//include next line in this line 
     //check to make sure we haven't run out of lines. 

     //combine end of previous field with start of the next one, 
     //and add the line break back in. 
     var innerFields = lines[i].Split(','); 
     fields[fields.Count - 1] += "\n" + innerFields[0]; 

     fields.AddRange(innerFields.Skip(1)); 
    } 

    //we now know we have a "real" full line 
    processFields(fields); 
} 

(爲簡單起見,我假設所有線路都在開始讀,我相信你可以改變它懶洋洋地獲取每一行很容易。)

+0

我喜歡這個。會放棄它。 – NotMe

+0

完美工作。 – NotMe

0

讓我開始說你的例子中的CSV文件是無效的。如果在一個字符串內發生換行符,它應該用雙引號字符包裝。

現在的答案 - 爲了解析這個無效的CSV格式,你必須做幾個假設。在這種情況下,我做了2個假設:1)ID列必須是數字2)註釋字段不能包含數字。

基於這些假設,您可以檢查換行符後面的第一個字符。如果它是數字,那麼你會假設它有一個新的記錄。如果不是,您應該將其視爲註釋字段的繼續值。

我不知道第二個假設是否有效,如果沒有,您可以增強邏輯,以便涵蓋系統的業務規則。

祝你好運!

+0

你完全正確無效。然而,產生垃圾的大型巨型企業已經承諾將其修復3年,所以我不屏住呼吸。不幸的是,我們不能保證1,評論領域可能會以數字開頭。 – NotMe

0

首先,我會推薦使用工具來管理讀取和寫入您的CSV文件,我使用FileHelpers library這是偉大的。

你基本上可以輸入你的記錄,它會爲你做所有的驗證。值得努力。

對於你的問題,也許你可以對文件做一些預處理,並使用Regex用空格替換任何換行符?

我做同樣的事情(不是文件,而是)嘗試

line.Replace(Environment.NewLine, " "); 

隨着FileHelpers你可以寫一個自定義轉換器處理過程中要做到這一點,或掛接到BeforeRead事件。

+0

我們已經在使用FileHelpers。但是,它不符合規範的線條,所以我們設置它忽略這些規則並繼續前進。如果你有編寫一個自定義轉換器來處理它的細節,我會感興趣... – NotMe