gpt4 book ai didi

clojure - 在 Clojure 中有更好的方法吗?

转载 作者:行者123 更新时间:2023-12-04 02:51:35 25 4
gpt4 key购买 nike

我有这个函数来读取文件并将其转换为双元素列表的列表:

(def f1 "/usr/example")

(defn read-file [file]
(let [f
(with-open [rdr (clojure.java.io/reader file)]
(doall (map list (line-seq rdr))))]
(cond
(= file f1) (map #(map read-string (split (first %) #" ")) f)
:else (map #(map read-string (split (first %) #"\t")) f))))

我使用 cond 正确拆分文件(我有两种类型的文件,第一种用空格分隔元素,第二种用制表符分隔元素)。

第一种类型的文件是这样的:

"1.3880896237218878E9 0.4758112837388654
1.3889631620596328E9 0.491845185928218"

而第二个是:

'1.3880896237218878E9\t0.4758112837388654
1.3889631620596328E9\t0.491845185928218"

我得到了我想要的结果,例如:

((1.3880896237218878E9 0.4758112837388654) (1.3889631620596328E9 0.491845185928218))

但我想知道是否有更简洁的方法来做到这一点,也许使用更少的 map 函数或者不使用 cond

最佳答案

这将返回一个向量的向量,在任意空白处拆分各个行并使用 Double/parseDouble 读取各个 double 。它不处理文件中的任何单引号或双引号字符;如果它们是实际输入的一部分,我想我只是用正则表达式对其进行预处理以摆脱它们(见下文)。

(require '[clojure.java.io :as io] '[clojure.string :as string])

(defn read-file [f]
(with-open [rdr (io/reader f)]
(mapv (fn [line]
(mapv #(Double/parseDouble %) (string/split line #"\s+")))
(line-seq rdr))))

至于上述预处理,您可以使用 #(string/replace % #"['\"]""") 删除所有单引号。如果它们出现在输入的开头和结尾,或者可能是单独的行。(如果引用了单独的数字,那么您需要确保没有删除它们之间的所有分隔符——在这种情况下,最好替换为一个空格,然后使用 string/trim 删除字符串末尾的任何空格。)

关于clojure - 在 Clojure 中有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17550077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com