基本上,我使用slurp来获取应该是数据库的文件的内容。我已经将数据拆分一次并且有一个包含正确所有信息的向量。现在我想再次分割向量中的每个元素。这会给我一个矢量矢量。我的问题是我似乎无法找到迭代矢量并进行更改的正确方法。更改要么不起作用,要么不存储在向量中。
使用doseq:
(doseq [x tempVector]
(clojure.string/split x #"|")
)
如果我在循环中添加一个print语句,它会打印出没有任何变化的所有间隔。 我做错了什么?
答案 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"]]