在向量的每个元素上使用split

时间:2018-04-04 22:43:08

标签: clojure

基本上,我使用slurp来获取应该是数据库的文件的内容。我已经将数据拆分一次并且有一个包含正确所有信息的向量。现在我想再次分割向量中的每个元素。这会给我一个矢量矢量。我的问题是我似乎无法找到迭代矢量并进行更改的正确方法。更改要么不起作用,要么不存储在向量中。

使用doseq:

(doseq [x tempVector]
        (clojure.string/split x #"|")
    )

如果我在循环中添加一个print语句,它会打印出没有任何变化的所有间隔。 我做错了什么?

2 个答案:

答案 0 :(得分:1)

str/split函数返回一个新的字符串向量,您需要保存它。现在它正在生成然后被丢弃。你需要这样的东西:

(ns xyz
  (:require
    [clojure.string :as str]))

(def x "hello there to you")
(def y (str/split x #" "))  ; save result in `y`
(def z (str/split x #"e"))  ; save result in `z`

y => ["hello" "there" "to" "you"]
z => ["h" "llo th" "r" " to you"]

您可以在线阅读clojure基础知识:https://www.braveclojure.com 我推荐购买这本书,因为它比在线版本更多。

如果向量中有多个字符串,则可以使用map函数依次拆分每个字符串:

(def my-strings
  ["hello is there anybody in there?"
   "just nod if you can hear me"
   "is there anyone at home?"])

(def my-strings-split
  (mapv #(str/split % #" ") my-strings))

my-strings-split   => 
  [["hello" "is" "there" "anybody" "in" "there?"]
   ["just" "nod" "if" "you" "can" "hear" "me"]
   ["is" "there" "anyone" "at" "home?"]]

答案 1 :(得分:1)

要将潦草的文字重组为一系列单词矢量,您可以执行以下操作:

(use '[clojure.string :as str :only [split]])

(defn file-as-words [filename re]
  (let [lines      (line-seq (clojure.java.io/reader filename))
        line-words (vec (mapv #(str/split %1 re) lines))]
    line-words))

这里我们定义一个函数,它首先使用line-seq来压缩文件并将其分解为一个行集合,然后我们映射一个匿名函数,该函数在初始集合的每一行上调用clojure.string / split ,将每一行分成由传入的正则表达式分隔的单词集合。返回单词向量的集合。

例如,假设我们有一个名为/usr/data/test.dat的文件,其中包含

Alice,Eating,001
Kitty,Football,006
May,Football,004

如果我们使用

调用file-as-words
(file-as-words "/usr/data/test.dat" #",")

你回来了

[["Alice" "Eating" "001"] ["Kitty" "Football" "006"] ["May" "Football" "004"]]