2017-01-12 42 views
1

我的問題是:正則表達式從混亂的字符清潔CSV

我使用的一些軟件就出來了一個csv,而問題是,這個軟件是不是處理CSV如此出色的原因有一些字符串在他們中引用的csv以及包裝字符串的內容也被引用,因此我會解析它。

所以這是正常的CSV:

"one","two","three" 

,這裏是我的情況:

"one","tw"o","three" 

所以我有問題解析字符串像"tw"o"。這基本上是輸出文件的軟件的問題,我無法編輯該軟件。

所以我想我可以創建一個正則表達式,將採取不必要的引號或逗號,並確保每個字符串都包在引號中並用逗號分隔,有人知道我該如何實現它?

即時通訊使用的tototoshi庫斯卡拉

+0

是否有一個特定的原因,您爲什麼不使用Python的'csv'包來處理'.csv'文件? –

+0

@WillemVanOnsem即時通訊使用tototoshi for scala,但這些庫不能解析它,因爲它不是一個正確的格式...如果它是「一個」,「兩個」,「三個」沒有問題,但它的「一個」,「tw」 o「,」three「,所以圖書館不能解析它 – JohnBigs

+0

爲什麼總是看正則表達式?即使你找到了這個東西,我*認爲*看起來可能非常可怕。哎喲:你需要**其他**人甚至想一想,對於你來說,保持**這個正則表達式有多容易?意思是:有時候應該考慮坐下來寫他自己的解析器,並明確地做事;而不是拋出怪物的正則表達式。 – GhostCat

回答

1

我試着Python的CSV模塊,它是能夠做到這一點(聽起來像一個黑客,但畢竟輸入文件是錯誤的,並使用正則表達式將是一個黑客太) :

import csv 

z = '''"one","tw"o","three"''' 

cr = csv.reader([z]) 
print(next(cr)) 

結果:

['one', 'two"', 'three'] 

出於某種原因,該帖已經在字符串的結尾移動(把一個雙引號在一個領域將是加倍的有效方法) 。

要刪除它,你可以做

print([x.replace('"',"") for x in next(cr)]) 

得到

['one', 'two', 'three'] 

注意,因此,如果該帖後面跟一個逗號CSV將發行4場與"one","tw",o","three",實在不行,只有人類驗證可以解決此問題。

0

一個可能爲你工作很簡單的正則表達式的解決辦法是這樣的:

正則表達式:(?<=\w)"(?=\w) //global flag

取代:'' //blank string

只要我們可以查看「壞」雙引號那些包圍字母數字,這將工作。這僅僅是對於字母數字,雙引號和向字母數字的向前看。它不會匹配雙引號和反斜槓或其他雙引號,因此""\"會沒事。

demo here

0

看起來你無法預測你可能會得到什麼樣的轉義帶引號的值。使用正則表達式無法可靠地清理它。

也許嘗試univocity-parsers,因爲它有一個CSV解析器,可以正確處理這種輸入。例如:

//first configure the parser 
    CsvParserSettings settings = new CsvParserSettings(); 

    //override the default unescape quote handling. This seems more appropriate for your case. 
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE); 

    //then create a parser and parse your input line: 
    CsvParser parser = new CsvParser(settings); 
    List<String[]> results = parser.parseAll(<your input here>); 

希望它有幫助。

聲明:我是該庫的作者。它是開源的和免費的(Apache v2.0許可證)