【发布时间】:2014-05-26 20:47:40
【问题描述】:
假设我有一个文件,其行看起来像这样apple,pie,100,1000。从每一行我想有一个像["apple" "pie" 100 1000] 这样的向量,其中前两个是字符串,第二个是整数或 Longs 或其他。
解决办法是
(defn foo [line]
(let [[a b c d] (split line #",")]
[a b (Integer/parseInt c) (Integer/parseInt d)]))
这可以满足我的要求,但我不确定是否有更好(或更惯用的)方法来做到这一点。
从这个问题What's the easiest way to parse numbers in clojure?,我发现了clojure.edn,所以我可以像这样使用read-line
(map read-string (clojure.string/split "apple,pie,12,134" #","))
;=> (:apple :pie 12 134)
但这给了我符号而不是字符串。
这道题Convert a sequence of strings to integers (Clojure)也类似,只是行中只包含数字,不包含数字和字符串。
注意:clojure-csv (https://github.com/davidsantiago/clojure-csv) 和 clojure.data.csv (https://github.com/clojure/data.csv) 似乎没有自动执行此操作的函数。
【问题讨论】:
-
“更好”取决于您想对数据做什么。您可以使用
name将符号转换为字符串,或者您可以使用 csv 库、拥有架构等。也许您的问题需要更多上下文。 -
当您说架构时,您指的是github.com/Prismatic/schema?
-
更好,我的意思是更惯用。也许在某个 clojure 命名空间或第 3 方库中有些东西,但我找不到。