分享您的看法,参加

欢迎!请参见关于页面,了解此工具的一些更多信息。

+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返回的是一个惰性序列;如果没有使用doall,则在读取任何内容之前,with-open会关闭读取器。

如果我想查找比如说向量[2(Sue Jones 43 Rose Court Street 345-7867)]呢?你有什么主意我可以怎么进行?我一直正在寻找一种方法,通过提供向量(向量的第一个元素)来返回特定的向量,但仍然卡住了...
谢谢!
有很多方法 - 你试过什么?最简单的方法可能就是使用`filter`和`first`。
...