2015-06-19 57 views
2

我想用逗號分隔一個csv字符串作爲分隔符。解析一個CSV字符串,同時忽略單個列內的逗號

val string ="A,B,"Hi,There",C,D" 

我不能使用string.split(","),因爲它會分裂"Hi,There"作爲兩個不同的列。我可以使用正則表達式來解決這個問題嗎?我來到了scala-csv parser,我不想使用它。我希望有更好的方法來解決這個問題。我知道這不是一個小問題。如果人們可以分享他們的方法來解決這個問題,那將會很有幫助。

+2

CSV分析並不是微不足道的,因爲你意識到。所以對於這種格式來說,提供一個完整的答案可能太寬泛了,所以要求工具是脫離主題的,所以我認爲這個問題不適合這個網站。 –

+0

@Gábor你讓我錯了。我不想使用任何工具。我希望人們在這裏分享邏輯或任何好的方法。我可以使用像'scala-csv'這樣的解析器來完成這個任務。但是,我想要一個開放的邏輯方法來解決這個問題。如果人們在這裏分享方法,我認爲這個問題將會有所幫助。 – COSTA

+2

@COSTA解決這個問題的邏輯方法是使用已建立的庫,因爲csv解析非常不平凡。 – Daenyth

回答

2

使用uniVocity-parsers CsvParser爲代替手工解析它。 CSV比您想象的要難得多,並且有很多角落案例可供報道。你剛剛找到一個。總之,您需要一個庫來可靠地讀取CSV。單義的解析器被其他斯卡拉項目(如火花CSV)

我會在這裏用普通的Java,因爲我不知道斯卡拉把一個例子,但你會得到的想法:

public static void main(String ... args){ 
    CsvParserSettings settings = new CsvParserSettings(); //many options here, check the documentation 
    CsvParser parser = new CsvParser(settings); 
    String[] row = parser.parseLine("A,B,\"Hi,There\",C,D"); 
    for(String value : row){ 
     System.out.println(value); 
    } 
} 

輸出:

A 
B 
Hi,There 
C 
D 

披露:我是這個庫的作者。它是開放源代碼和免費的(Apache V2.0許可證)。

3

我同意Jeronimo Backes,csv解析不是微不足道的,它更好地使用庫而不是重新發明輪子。

此外uniVocity-parsers有可用一些其它更階定向庫(底層解析器表示):

product-collections,我自己的項目,對照與univocity相同的數據和csv spectrum進行了很好的測試。它是強類型,無反射和與scala-js兼容。這是tested for performance against most of the java equivalents.

其他列出的項目都有自己的優勢。 Scala-csv很難從沒有墊片的java調用,所以雖然我在內部測試過,但是我無法對csv-parsers-comparison進行pull請求。

產品集合過去利用opencsv,但爲了使它與scala-js兼容,它現在包含一個本地解析器。在我測試的所有場景中,解析器的性能都優於opencsv(速度,正確性)。

相關問題