我想用逗號分隔一個csv字符串作爲分隔符。解析一個CSV字符串,同時忽略單個列內的逗號
val string ="A,B,"Hi,There",C,D"
我不能使用string.split(",")
,因爲它會分裂"Hi,There"
作爲兩個不同的列。我可以使用正則表達式來解決這個問題嗎?我來到了scala-csv parser
,我不想使用它。我希望有更好的方法來解決這個問題。我知道這不是一個小問題。如果人們可以分享他們的方法來解決這個問題,那將會很有幫助。
我想用逗號分隔一個csv字符串作爲分隔符。解析一個CSV字符串,同時忽略單個列內的逗號
val string ="A,B,"Hi,There",C,D"
我不能使用string.split(",")
,因爲它會分裂"Hi,There"
作爲兩個不同的列。我可以使用正則表達式來解決這個問題嗎?我來到了scala-csv parser
,我不想使用它。我希望有更好的方法來解決這個問題。我知道這不是一個小問題。如果人們可以分享他們的方法來解決這個問題,那將會很有幫助。
使用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許可證)。
此正則表達式包括你的榜樣,可能還有其他人,但肯定不是穩健:
(?:,?(".+?"))|(?:,?(.+?),?)
Here'a上regex101演示:https://regex101.com/r/wM7uW4/1
我同意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(速度,正確性)。
CSV分析並不是微不足道的,因爲你意識到。所以對於這種格式來說,提供一個完整的答案可能太寬泛了,所以要求工具是脫離主題的,所以我認爲這個問題不適合這個網站。 –
@Gábor你讓我錯了。我不想使用任何工具。我希望人們在這裏分享邏輯或任何好的方法。我可以使用像'scala-csv'這樣的解析器來完成這個任務。但是,我想要一個開放的邏輯方法來解決這個問題。如果人們在這裏分享方法,我認爲這個問題將會有所幫助。 – COSTA
@COSTA解決這個問題的邏輯方法是使用已建立的庫,因爲csv解析非常不平凡。 – Daenyth