2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解有关此操作的更多信息。

+1
语法和读取器

我的代码

(defn loadData [filename]
(with-open [rdr (io/reader filename)]

(doseq [line (line-seq rdr)
        :let [ [id & data]
              (clojure.string/split line #"\|")] ]
            [
                (Integer/parseInt id) 
                data 
              ])
  
  ))

我的文件内容

1|Xxx|信息1|222-2222
2|Yyy|信息2|333-3333
3|Zzz|信息3|444-4444

如何让这个函数返回一个列表,如
{
{1, Xxx, 信息1, 222-2222}
{2, Yyy, 信息2, 333-3333}
{3, Zzz, 信息3, 444-4444}
}

1 答案

+1

被选中
 
最佳答案

因此,我认为这里的主要问题是 doseq 返回的是 nil 而不是列表。

也许这样的代码能帮您入门...

file.txt

1|Xxx|info1|222-2222
2|Yyy|info2|333-3333
3|Zzz|info3|444-4444

然后在REPL中

user> (defn load-data
        [filename]
        (with-open [r (clojure.java.io/reader filename)]
          (-> (for [line (line-seq r)]
                (let [[id name info phone] (clojure.string/split line #"\|")]
                  [(Integer/parseInt id) name info phone]))
              (doall))))
#'user/load-data
user> (load-data "file.txt")
([1 "Xxx" "info1" "222-2222"]
 [2 "Yyy" "info2" "333-3333"]
 [3 "Zzz" "info3" "444-4444"])

请注意,这里需要 doall,因为 for 返回的是一个惰性序列;没有 doallwith-open 将在读取任何内容之前关闭读取器。

如果我想搜索像[2 (Sue Jones 43 Rose Court Street 345-7867)]这样的向量怎么办?您有什么想法如何进行吗?我一直在寻找通过提供向量的数字(向量的第一个元素)来返回特定向量的方法,但还是卡住了...
谢谢!
有很多种方法 —— 你尝试了什么?最简单的方法可能是使用`filter`和`first`。
...