2013-04-25 58 views
3

我試圖解析各地領域與逃脫逗號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"] 有人知道一個庫可以做到這一點嗎?

在此先感謝

+0

我已經與[incanter](https://github.com/liebke/incanter)祝你好運。這可能是矯枉過正,所以你可能只想使用OpenCSV(一個依靠incanter)。 – Kyle 2013-04-25 14:19:34

+0

我會補充一點,我相信它是一個有效的CSV,你需要以下內容:'「\」test1,test2 \「 ,test3「' – Kyle 2013-04-25 14:22:09

回答

1

你有一個很好的藉口來編寫你自己的解析器:-)。
您可以使用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"]) 
+1

每個人都應該至少編寫一次自己的解析器! – noahlz 2013-04-25 16:06:15

+0

謝謝你指出這個庫給我。我用它來寫一個類似於你的解析器,但有一些簡化。 (在領域沒有新的線......)工作得很好。 – Finn 2013-04-30 11:17:50

6

你不完全解析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"]) 

您可能必須編寫自己的解析器或擴展上述庫之一來處理這種情況。

+0

謝謝。我喜歡你的評論,它不是標準的.csv。事實並非如此。 – octopusgrabbus 2013-04-25 16:03:46

+0

我的字段中也有雙引號,並用反斜槓進行轉義。我如何處理它們? – Finn 2013-04-25 16:25:06

+0

也許你應該開一個新的問題,要求指出這個問題的實現。這比你原來的問題要大一點。 – noahlz 2013-04-25 18:58:42