gpt4 book ai didi

clojure - 如何使用 Clojure 读取包含测试数据的文件?

转载 作者:行者123 更新时间:2023-12-03 00:26:07 29 4
gpt4 key购买 nike

我正在编写一段代码,需要读取包含数据的文本文件。文本文件的格式为:

name 1 4
name 2 4 5
name 3 1 9

我正在尝试以 [:name Sarah :weight 1 cost :4] 形式创建 map 矢量

当我尝试使用行顺序读取器读取文件时,它会将每一行作为一个项目读取,因此分区不正确。请参阅下面的回复:

(let [file-text (line-seq (reader "C://Drugs/myproject/src/myproject/data.txt"))
new-test-items (vec (map #(apply struct item %) (partition 3 file-text)))]
(println file-text)
(println new-test-items))


(sarah 1 1 jason 4 5 nila 3 2 jonas 5 6 judy 8 15 denny 9 14 lis 2 2 )
[{:name sarah 1 1, :weight jason 4 5, :value nila 3 2 } {:name jonas 5 6, :weight judy 8 15, :value denny 9 14}]

然后我尝试只取1个分区,但结构仍然不正确。

=> (let [file-text (line-seq (reader "C://Drugs/myproject/src/myproject/data.txt"))
new-test-items (vec (map #(apply struct item %) (partition 1 file-text)))]
(println file-text)
(println new-test-items))
(sarah 1 1 jason 4 5 nila 3 2 jonas 5 6 judy 8 15 denny 9 14 lis 2 2 )
[{:name sarah 1 1, :weight nil, :value nil} {:name jason 4 5, :weight nil, :value nil} {:name nila 3 2 , :weight nil, :value nil} {:name jonas 5 6, :weight nil, :value nil} {:name judy 8 15, :weight nil, :value nil} {:name denny 9 14, :weight nil, :value nil} {:name lis 2 2, :weight nil, :value nil} {:name , :weight nil, :value nil}]
nil

接下来我尝试读取该文件,但情况更糟:

=> (let [slurp-input (slurp "C://Drugs/myproject/src/myproject/data.txt")
part-items (partition 3 slurp-input)
mapping (vec (map #(apply struct item %) part-items))]
(println slurp-input)
(println part-items)
(println mapping))
sarah 1 1
jason 4 5
nila 3 2
jonas 5 6
judy 8 15
denny 9 14
lis 2 2

((s a r) (a h ) (1 1) (

请帮忙!在 Java 中这似乎是一件很容易做到的事情,但在 Clojure 中却让我丧命。

最佳答案

将其分成一系列行:

(line-seq (reader "/tmp/data"))

将它们分成一个单词序列

(map #(split % #" ") data)

创建一个函数,接受一个数据的向量并将其转换为具有正确键的映射

(fn [[name weight cost]] 
(hash-map :name name
:weight (Integer/parseInt weight)
:cost (Integer/parseInt cost)))

然后将它们重新嵌套在一起<​​/p>

(map (fn [[name weight cost]] 
(hash-map :name name
:weight (Integer/parseInt weight)
:cost (Integer/parseInt cost)))
(map #(split % #" ") (line-seq (reader "/tmp/data"))))

({:weight 1, :name "name", :cost 4}
{:weight 2, :name "name", :cost 4}
{:weight 3, :name "name", :cost 1})

您还可以使用zip-map使其更加紧凑

关于clojure - 如何使用 Clojure 读取包含测试数据的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494431/

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