Parsing 带转义逗号的clojure csv

Parsing 带转义逗号的clojure csv,parsing,csv,clojure,Parsing,Csv,Clojure,我试图在clojure中解析一个csv字符串,其中包含转义的逗号,并且像这样的字段周围没有引号 "test1\,test2,test3" 我尝试了以下方法: [org.clojure/data.csv“0.1.2”] [cljcsv“1.3.1”] [clojure csv/clojure csv“2.0.0-alpha1”] 但他们中似乎没有人能够正确地将此识别为[“test1,test2”“test3”] 有人知道可以这样做的图书馆吗 提前感谢您并不是在解析CSV数据,而是一些派生(注

我试图在clojure中解析一个csv字符串,其中包含转义的逗号,并且像这样的字段周围没有引号

"test1\,test2,test3"
我尝试了以下方法:

  • [org.clojure/data.csv“0.1.2”]
  • [cljcsv“1.3.1”]
  • [clojure csv/clojure csv“2.0.0-alpha1”]
但他们中似乎没有人能够正确地将此识别为
[“test1,test2”“test3”]
有人知道可以这样做的图书馆吗


提前感谢

您并不是在解析CSV数据,而是一些派生(注意我没有写“标准”)

在CSV中,逗号不会转义。这是从C/C++/Java字符串转义泄漏到数据中的内容。如果它是典型的CSV,它会这样写

"a,b",c
clojure csv支持的

user=> (csv/parse-csv (str "\"a,b\",c")) 
(["a,b" "c"])

您可能需要编写自己的解析器,或扩展上述库之一来处理这种情况。

您有一个很好的理由来编写自己的解析器:-)
您可以使用Instaparse:

更新: 好吧,我自己也抵挡不住诱惑:-)
更新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"])
(需要“[instaparse.core:as insta]”
(定义自定义csv)
(insta/parser)
“文件=(行)*行
行=(字段)*字段
下线='\\r'?'\\n'
=普通字段|引用字段
带引号的字段=(转义字符)*
普通字段=(字段字符|转义字符)*
=\'[^\r\\n,\\\“]+'
转义字符=\\\\\.'
"))
(def测试str)
“test1\\,test2,test3
te\\s\\\\t4,\“te,st
5\"")
(自定义csv测试str)
; 结果:
; [:文件
第二行
;[:普通字段“test1”[:转义字符“\\,”]“test2”]
;[:普通字段“test3”]]
第二行
;[:普通字段“te”[:转义字符“\\s”][:转义字符“\\\\”]“t4”]
;“te,st\n5”]]
(->>(自定义csv测试str)
(安装/转换)
{
:文件列表
:线向量
:普通字段str
:引用字段str
:转义字符秒
}))
; 结果:
; ([“test1,test2”“test3”][“tes\\t4”“te,st\n5”])

我在这方面运气不错。这可能有点过分,所以您可能只想使用OpenCSV(白炽灯依赖项)。我要补充一点,我相信它是一个有效的CSV,您需要以下内容:
“\“test1,test2\”,test3”
谢谢。我喜欢你的评论,它不是标准的.csv。不是。我的字段中也有双引号,用反斜杠转义。我如何处理它们?也许你应该提出一个新的问题,询问如何实现这个问题。它的范围比您原来的问题要大一点。每个人都应该至少编写一次自己的解析器!谢谢你给我指出这个图书馆。我用它编写了一个类似于您的解析器,但做了一些简化。(田地里没有新的生产线……)工作得很好。