我試圖解析各地領域與逃脫逗號Clojure的一個CSV字符串中沒有報價像這樣的Clojure的CSV與轉義逗號
"test1\,test2,test3"
我想這個庫:
- [組織。的Clojure/data.csv 「0.1.2」]
- [cljcsv 「1.3.1」]
- [Clojure的-CSV/Clojure的-CSV 「2.0.0-α1」]
但他們沒有一個似乎能夠正確識別這個["test1,test2" "test3"]
有人知道一個庫可以做到這一點嗎?
在此先感謝
我試圖解析各地領域與逃脫逗號Clojure的一個CSV字符串中沒有報價像這樣的Clojure的CSV與轉義逗號
"test1\,test2,test3"
我想這個庫:
但他們沒有一個似乎能夠正確識別這個["test1,test2" "test3"]
有人知道一個庫可以做到這一點嗎?
在此先感謝
你有一個很好的藉口來編寫你自己的解析器:-)。
您可以使用Instaparse:https://github.com/Engelberg/instaparse
更新: OK,我無法抗拒的誘惑,自己:-)
更新2:允許帶引號的字符串內轉義字符。
(require '[instaparse.core :as insta])
(def custom-csv
(insta/parser
"file = (line <eol>)* line
line = (field <','>)* field
eol = '\\r'? '\\n'
<field> = plain-field | quoted-field
quoted-field = <'\\\"'> (#'[^\"\\\\]+' | escaped-char)* <'\\\"'>
plain-field = (field-chars | escaped-char)*
<field-chars> = #'[^\\\\\\r\\n,\\\"]+'
escaped-char = #'\\\\.'
"))
(def test-str
"test1\\,test2,test3
te\\s\\\\t4,\"te,st
5\"")
(custom-csv test-str)
; Result:
; [:file
; [:line
; [:plain-field "test1" [:escaped-char "\\,"] "test2"]
; [:plain-field "test3"]]
; [:line
; [:plain-field "te" [:escaped-char "\\s"] [:escaped-char "\\\\"] "t4"]
; "te,st\n5"]]
(->> (custom-csv test-str)
(insta/transform
{
:file list
:line vector
:plain-field str
:quoted-field str
:escaped-char second
}))
; Result:
; (["test1,test2" "test3"] ["tes\\t4" "te,st\n5"])
你不完全解析CSV數據,但一些推導of the convention(注意:我沒有寫「標準」)。
在CSV中,逗號不會被轉義。這是從C/C++/Java字符串轉義泄漏到您的數據。如果它是典型的CSV,將它寫成這樣
"a,b",c
其中的Clojure-CSV支持。
user=> (csv/parse-csv (str "\"a,b\",c"))
(["a,b" "c"])
您可能必須編寫自己的解析器或擴展上述庫之一來處理這種情況。
謝謝。我喜歡你的評論,它不是標準的.csv。事實並非如此。 – octopusgrabbus 2013-04-25 16:03:46
我的字段中也有雙引號,並用反斜槓進行轉義。我如何處理它們? – Finn 2013-04-25 16:25:06
也許你應該開一個新的問題,要求指出這個問題的實現。這比你原來的問題要大一點。 – noahlz 2013-04-25 18:58:42
我已經與[incanter](https://github.com/liebke/incanter)祝你好運。這可能是矯枉過正,所以你可能只想使用OpenCSV(一個依靠incanter)。 – Kyle 2013-04-25 14:19:34
我會補充一點,我相信它是一個有效的CSV,你需要以下內容:'「\」test1,test2 \「 ,test3「' – Kyle 2013-04-25 14:22:09