如何解析txt列表作为Clojure中的符号?

时间:2017-10-03 11:59:34

标签: clojure

我还是Clojure的新人;我试图拆分从txt文件解析的值,

我需要将这些单词作为sembol添加到列表中。例如

示例txt文件:

  

这是一个简单的测试

,结果如下:

'((t h i s) (i s) (a) (s i m p l e) (t e s t)

请提前帮助,谢谢。

2 个答案:

答案 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空格。 编辑:添加字符串/修剪以删除不必要的白页。