Clojure:将字符串文件放入整数数组

时间:2016-12-08 00:26:02

标签: clojure

使用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)))

2 个答案:

答案 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。