我是Clojure的新手,很难理解矢量/列表/地图的操作。我试图打印出数据中所有客户的名字,但我无法弄清楚如何。请帮忙。
(def data
"1|John Smith|123 Here Street|456-4567
2|Sue Jones|43 Rose Court Street|345-7867
3|Fan Yuhong|165 Happy Lane|345-4533")
(defn test
[]
(let [lines (str/split-lines data)
line-vecs-1 (mapv #(str/split % #"\|" ) lines)]
(for [x line-vector-c] (print (line-vector-c 1))
)
)
)
给了我:
[2 Sue Jones 43 Rose Court Street 345-7867][2 Sue Jones 43 Rose Court Street
345-7867][2 Sue Jones 43 Rose Court Street 345-7867]
我想要的是什么:
"John Smith"
"Sue Jones"
"Fang Yuhong"
答案 0 :(得分:3)
到目前为止(略有改写)你得到的是:
(mapv (fn [l]
(str/split l #"\|"))
(str/split-lines data))
(str/split-lines data)
将行拆分为一系列字符串:
["1|John Smith|123 Here Street|456-4567"
"2|Sue Jones|43 Rose Court Street|345-7867"
"3|Fan Yuhong|165 Happy Lane|345-4533"]
(mapv #(str/split % #"\|") lines)
将每一行拆分为字符串元组:
[["1" "John Smith" "123 Here Street" "456-4567"]
["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]
现在,您希望将每个字符串元组转换为每个元组的第二个元素。您可以使用以下几种功能:get
或nth
(两者都是从零开始)。
例如:
(mapv (fn [l]
(get (str/split l #"\|")
1))
(str/split-lines data))
答案 1 :(得分:1)
您可以使用
获取名称列表(doseq [n names]
(println n))
然后用
打印每个名字sequence
我经常使用{{1}}和组合传感器来探索数据,因为它可以方便地一步一步地构建变换。
答案 2 :(得分:0)
您可以拆分每一行并获得第二列,如下所示
(defn test [xs]
(->> (str/split-lines xs) ;split lines
(map #(str/split % #"\|")) ;get columns
(map second))) ;only the second element of each line
并打印结果
(map println (test data))
或更好地使用 doseq 进行打印
(doseq [n (test data)]
(println n))
答案 3 :(得分:0)
(map second (re-seq #"\|(.*?)\|" data))
返回:
("John Smith" "Sue Jones" "Fan Yuhong")
我们要求re-seq
在每一行找到一对|
之间的第一个内容。正则表达式中的?
意味着我们需要非贪婪的搜索。
(re-seq #"\|(.*?)\|" data)
返回:
(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])
最后,我们使用map second
访问列表的每个元素,并仅获取向量的第二个字符串。