将列表矢量转换为矢量矢量

时间:2018-03-31 22:52:58

标签: list vector clojure

我在.txt文件中有以下数据:

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

我使用以下代码获取数据并将其转换为向量:

(def custContents (slurp "cust.txt"))
(def custVector (clojure.string/split custContents #"\||\n"))
(def testing (into [] (partition 4 custVector )))

这给了我以下载体:

[(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)]

我想把它转换成这样的矢量矢量:

[[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]]

2 个答案:

答案 0 :(得分:4)

我会稍微改变一下,所以你先把它分成几行,然后处理每一行。它还使正则表达式更简单:

(ns tst.demo.core
  (:require
    [clojure.string :as str] ))

(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")

  (let [lines       (str/split-lines data)
        line-vecs-1 (mapv #(str/split % #"\|" ) lines)
        line-vecs-2 (mapv #(str/split % #"[|]") lines)]
    ...)

结果:

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"]

line-vecs-1 => 
   [["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"]]

line-vecs-2 => 
   [["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"]]

请注意,有两种方法可以执行正则表达式。 line-vecs-1显示正则表达式,其中管道字符在字符串中转义。由于正则表达式在不同的平台上有所不同(例如,在Java上需要" \ |"),line-vecs-2使用单个字符(管道)的正则表达式类,这避免了转义的需要管。

<强> 更新

其他Clojure学习资源:

答案 1 :(得分:2)

> (mapv vec testing)

=> [["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"]]