2016-04-06 20 views
0

我必須處理一個奇怪的CSV格式,而且我一直在遇到問題。我已經能夠制定出迄今爲止的字符串是如何使用正則表達式來解析不規則的CSV並且不選擇某些字符

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

我的文件經常破裂,不規則的,因爲我們必須處理,通常這不是由我們的用戶檢查OCR'd文本。因此,我們傾向於結束很多奇怪的事情,比如單個「在一個領域內,甚至是一個換行符」(這就是爲什麼我使用Regex而不是我以前的基於readLine()的解決方案)。它能正確地解析大部分內容,除了捕獲[,] [,]。我怎樣才能讓它不只選擇只有一個逗號的字段?當我嘗試不讓它選擇逗號時,它會將「156,000」變成[156 ]和[000]

我一直在使用該測試字符串

"156,000","",""i","parts","dog"","","Monthly "running" totals" 

理想的願望捕獲輸出

[156,000],[],[i],[parts],[dog],[],[Monthly "running" totals] 

我可以帶或不帶內部引號,因爲我總是可以在處理過程中剝離它們。

非常感謝你的時間。

+0

? – anubhava

+0

我直接在C#中解析,所以.NET。 –

回答

0

你的CSV確實是不規則的,很難解析。我建議你先對數據進行2次替換。

// remove all invalid double "" 
input = Regex.Replace(input, @"(?<!,|^)""(?=,|$)|(?<=,)""(?!,|$)", "\""); 

// now escape all inner " 
input = Regex.Replace(input, @"(?<!,|^)"(?!,|$)", @"\\\""); 

// at this stage your have proper CSV data and I suggest using a good .NET csv parser 
// to parse your data and get individual values 

Replacement 1 demo

Replacement 2 demo

您使用正則表達式是什麼味道
相關問題