2012-08-03 110 views
2

我有一個CSV文件,具有以下類型的數據:使用正則表達式通過CSV讀取文件

0,'VT,C',0, 
0,'C,VT',0, 
0,'VT,H',0, 

,我希望下面的輸出

0 
VT,C 
0 
0 
C,VT 
0 
0 
VT,H 
0 

因此分裂的字符串然而忽略引號內的逗號。目前我使用的正則表達式如下:

("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)"

然而,這給我的結果:

0 
VT 
C 
0 
0 
C 
VT 
0 
0 
VT 
H 
0 

這顯示正則表達式是不正確讀取引號。任何人都可以提出一些可能有幫助的改動嗎?

+0

檢查:http://stackoverflow.com/questions/3268622/regex-to-split-line-csv-file – NoviceProgrammer 2012-08-03 13:55:30

回答

0

我必須設法得到後有位以下方法根據需要讀取文件:

public List<string> SplitCSV(string input, List<string> line) 
    { 

     Regex csvSplit = new Regex("(([^,^\'])*(\'.*\')*([^,^\'])*)(,|$)", RegexOptions.Compiled); 

     foreach (Match match in csvSplit.Matches(input)) 
     { 
      line.Add(match.Value.TrimStart(',')); 
     } 
     return line; 
    } 

謝謝儘管每個人都有幫助。

+0

其實不編譯,因爲你應該將值添加到'hot' List ...並且應該使用'TrimEnd()'而不是'TrimStart()'。這使用我提出的策略,但使用了不同的正則表達式。您的表情不會認爲與上述樣本不完全相同的情況。這就是爲什麼我寫了一個更一般的表達。無論如何,你似乎會問一個問題,然後讓討論走自己的路。希望您的解決方案不會因其他情況而失敗。 – 2012-08-03 14:53:46

+0

輸入應該表示什麼? – 2014-05-19 20:02:49

-1

按「\ n」分割,然後按「'」,然後在該詞末尾或詞尾開始處移除','。我確信有一個更優雅的方式來做這件事,我確定有一種方法可以用正則表達式來做,但我懷疑它們是以相同的方式。

1

通常,當涉及到CSV解析時,人們使用特定的庫非常適合他們正在使用的編程語言來編寫他們的應用程序。

無論如何,如果你要使用正則表達式來拍一部真正的鬆動解析您可以嘗試使用這樣的事情(!):

'(?<value>[^']*?)' 

它將匹配在單引號之間的任何東西,並假設csv文件格式正確,不會錯過任何一個字段。當然,它不接受嵌入式報價,但很容易完成工作。當我需要很快完成工作時,這就是我所使用的。請不要認爲它是你的問題的完整解決方案......它只是在特殊條件下工作,當你所描述的要求和輸入結構良好時。

[編輯]

我又被你的問題檢查,發現你想也包括非引述領域......好吧好吧在這種情況下,我的表情不會在所有的工作。無論如何聽...如果你認真思考你的問題,你會發現這是一個很難解決的問題,沒有歧義。因爲你需要固定的規則,並且如果你允許帶引號和不帶引號的字段,解析器將很難找出合法的逗號作爲分隔符/引號。

另一種表達這樣的解決方案模型可以:

('[^']+'|[^,]+),? 

將同時匹配報價/ notquoted領域......反正我不知道它是否需要承擔CSV一直堅持以嚴格條件。就我所知,這將比分割策略更安全......您只需收集所有匹配項並在目標字符串上打印matched_value + \r\n即可。

0

此正則表達式是基於以下事實:你之前和你「價值」

Regex.Replace(input, @"(?:(?<=\d),|,(?=\d))", "\n"); 

你可以測試出來的RegexStorm

0
foreach(var m in Regex.Matches(s,"(('.*?')|[0-9])"))