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|info1|222-2222
2|Yyy|info2|333-3333
3|Zzz|info3|444-4444

我如何让这个函数返回一个类似下面的列表
{
{1, Xxx, info1, 222-2222}
{2, Yyy, info2, 333-3333}
{3, Zzz, info3, 444-4444}
}

1 回答

+1
by
selected by
 
最佳答案

我认为这里主要的问题是,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 返回的是一个惰性序列;如果没有 doall,在读取任何内容之前,with-open 会关闭读取器。

比如我想查找向量[2 (Sue Jones 43 Rose Court Street 345-7867)],您有没有什么办法可以实现呢?我一直在寻找一种通过提供向量中的数字(向量的第一个元素)返回特定向量的方法,但仍然卡住了...
谢谢!
有很多种方法——你试了哪些?最简单的方法可能是使用`filter`和`first`。
...