我还是Clojure的新人;我试图拆分从txt文件解析的值,
我需要将这些单词作为sembol添加到列表中。例如
示例txt文件:
这是一个简单的测试
,结果如下:
'((t h i s) (i s) (a) (s i m p l e) (t e s t)
请提前帮助,谢谢。
答案 0 :(得分:5)
首先你需要将一行分成单词,
然后每个单词都应该用char->symbol
转换函数映射:
类似的东西:
user> (require '[clojure.string :as cs])
nil
user> (defn to-syms [s]
(let [words (cs/split (cs/trim s) #"\s+")]
(map #(map (comp symbol str) %) words)))
#'user/to-syms
user> (to-syms "this is a line")
;;=> ((t h i s) (i s) (a) (l i n e))
<强>更新强>
扩展:
首先从字符串中获取所有单词,用空格分隔:
(cs/split (cs/trim "aaa bbb ccc") #"\s+")
;;=> ["aaa" "bbb" "ccc"]
然后我们需要组成一个处理将其转换为符号列表的单词的函数。由于clojure字符串是一系列字符,您可以map
覆盖它,产生新的集合:
(defn char->sym [c]
(symbol (string c))
user> (char->sym \a)
;;=> a
user> (map char->sym "asd")
;;=> (a s d)
;; in my example i use the functional composition: (comp symbol str)
;; that creates the function that works exactly like char->sym
;; let's wrap this mapping to a function:
(defn word->syms [w]
(map char->sym w))
user> (word->syms "asd")
;;=> (a s d)
;; and now we just have to transform the whole list of words:
user> (map word->syms ["asd" "fgh"])
;;=> ((a s d) (f g h))
此外,要将符号列表转换为返回字符串,您只需调用str
函数,将所有列表项作为参数(apply str '(a s d)) => "asd"
,或使用clojure.string/join
那:(clojure.string/join '(a s d)) => "asd"
答案 1 :(得分:1)
首先,您需要调用split来获取字符串的单词。然后,对于每个单词,您需要迭代并将字符转换为符号。使用for宏进行迭代最容易。您可以使用str将字符转换为字符串,并使用symbol将字符串转换为符号。
(defn line-to-lists [line]
(for [word (clojure.string/split (clojure.string/trim line) #"\s+")]
(for [char word] (symbol (str char)))))
(line-to-lists "this is a simple test")
您可以使用slurp获取文件的内容,并按如下方式调用该函数:
(line-to-lists (slurp "file.txt"))
编辑:修复为使用多个空格和traling / leading空格。 编辑:添加字符串/修剪以删除不必要的白页。