使用clojure,如何读取字符串文件并将其存储在int-array或vector中。
到目前为止,这是我的功能。
SELECT pb.pin, pb."MAX HOURS", bm.max_hours
FROM pa_btc pb
left join
bucket_max bm
on pb."MAX HOURS" >= bm.max_hours_val
;
我不知道从哪里开始。我试图在convert函数中调用getData函数,但没有运气,因为getData函数没有返回字符串。
(:require [clojure.java.io :as io])
(defn getData [filename]
(doseq [line
(with-open [rdr (io/reader filename)]
(doall (line-seq rdr)))]
(println line)))
(defn convert [string]
(map #(Integer/parseInt %)
(.split #" " string)))
答案 0 :(得分:0)
你应该阅读更多关于clojure的内容,或许可以通过4clojure中的一些练习来加强你的理解。你的尝试非常困惑,我不确定你是否了解每条线的作用。
基本上,您正在使用doseq
在所有行上停留并将它们打印到屏幕上,然后返回nil
。然后,您尝试将转换应用于nil
。你应该做得很好,只需返回doall
的结果。
对于您的convert
功能,您尝试拆分字符串列表,首先应将split
映射到列表上,然后在结果上调用parseInt
。你不需要使用apply
来调用它,而是将参数视为字符串列表,它会更有意义。
答案 1 :(得分:0)
首先,你的档案怎么样?
我认为它就像那样
1 2 3
4 5 6
7 8 9 10
首先,您要将一行解析为整数集合(str / split来自clojure.string):
(defn parse-line [str-line]
(->> (str/split str-line #" " )
(map #(Integer/parseInt %))))
那么你想将它应用于所有行并返回一个整数的大数组(java数组?):
(defn getData [filename]
(with-open [rdr (io/reader filename)]
(let [data (line-seq rdr)]
(int-array (mapcat parse-line data)))))
如果你想拥有单独的数组
(defn getData [filename]
(with-open [rdr (io/reader filename)]
(let [data (line-seq rdr)]
(doall (map (comp int-array parse-line) data)))))
Line-seq返回一系列行。因此,即使您添加一行,line-seq也会返回包含单行的序列。 如果你想要vector,只需用vec替换int-array。对于序列,删除int-array。