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

被选中
 
最佳答案

我认为这里的主要问题是,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会在读取任何内容之前关闭读取器。

by
如果我想要查找这样的向量,比如 [2 (Sue Jones 43 Rose Court Street 345-7867)],您有什么建议吗?我一直在寻找一种通过提供向量编号(向量的第一个元素)来返回特定向量的方法,但仍然有点卡住了...
谢谢!
by
有很多种方法 - 你尝试过哪些?最简单的方法可能是使用 `filter` 和 `first`。
...