Clojure 是否可以从输入文件中读取并将文本文件的每一行转换为字符串向量?

Clojure 是否可以从输入文件中读取并将文本文件的每一行转换为字符串向量?,clojure,Clojure,我有一个文本文件,如下所示: ---#--###---- -#---#----##- ####-#-#-#-## ---#---#-#--- -#-####---##- -#------#---- -############ ------------@ 我可以读取输入文件并以这种格式输出吗 [ ["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#"

我有一个文本文件,如下所示:

---#--###----
-#---#----##-
####-#-#-#-##
---#---#-#---
-#-####---##-
-#------#----
-############
------------@
我可以读取输入文件并以这种格式输出吗

[ ["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] 
  ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] 
  ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] 
  ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] 
  ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] 
  ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] 
  ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] 
  ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]
]
我尝试逐行读取输入文件并将其添加到向量:

    (defn loadFile2 []
        (with-open [rdr (clojure.java.io/reader "map.txt")]
        (reduce conj [] (line-seq rdr)))
    )

    (defn convert_input_to_string []
        "Converts"
        ;(def temp )
        (loop [i 0 temp (loadFile2)]
            (if (< i (count temp))

            (recur (inc i) (assoc temp i (str (join (seq (get temp 
             i))))) )
            temp
            ))
    )

(convert_input_to_string).
我想要这种格式的向量:

[ ["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] 
  ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] 
  ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] 
  ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] 
  ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] 
  ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] 
  ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] 
  ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
一步一步走

读取数据(因为文件很小,只是发出咕噜声)。让我们命名文件
grid.txt

(slurp "grid.txt")
"---#--###----\r\n-#---#----##-\r\n####-#-#-#-##\r\n---#---#-#---\r\n-#-####---##-\r\n-#------#----\r\n-############\r\n------------@"
分成几行:

(->> (slurp "grid.txt") 
     (clojure.string/split-lines))
["---#--###----" "-#---#----##-" "####-#-#-#-##" "---#---#-#---" "-#-####---##-" "-#------#----" "-############" "------------@"]
将每个字符串转换为字符向量:

(->> (slurp "grid.txt") 
     (clojure.string/split-lines) 
     (map vec))
([\- \- \- \# \- \- \# \# \# \- \- \- \-] [\- \# \- \- \- \# \- \- \- \- \# \# \-] [\# \# \# \# \- \# \- \# \- \# \- \# \#] [\- \- \- \# \- \- \- \# \- \# \- \- \-] [\- \# \- \# \# \# \# \- \- \- \# \# \-] [\- \# \- \- \- \- \- \- \# \- \- \- \-] [\- \# \# \# \# \# \# \# \# \# \# \# \#] [\- \- \- \- \- \- \- \- \- \- \- \- \@])
将顶层转换为向量:

(->> (slurp "grid.txt") 
     (clojure.string/split-lines) 
     (map vec) 
     (into []))
[[\- \- \- \# \- \- \# \# \# \- \- \- \-] [\- \# \- \- \- \# \- \- \- \- \# \# \-] [\# \# \# \# \- \# \- \# \- \# \- \# \#] [\- \- \- \# \- \- \- \# \- \# \- \- \-] [\- \# \- \# \# \# \# \- \- \- \# \# \-] [\- \# \- \- \- \- \- \- \# \- \- \- \-] [\- \# \# \# \# \# \# \# \# \# \# \# \#] [\- \- \- \- \- \- \- \- \- \- \- \- \@]]
请注意,这与预期的输出不同,因为内部向量包含字符,而不是字符串

如果确实需要字符串,则需要添加一行:

(->> (slurp "grid.txt") 
     (clojure.string/split-lines) 
     (map #(map str %)) 
     (map vec) 
     (into []))
[["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]

如果您能够将整个输入文件加载到内存中,那么这里有一个快速而肮脏的函数,它可以做到这一点:

(defn read-vec-of-strings [filename]
  (let [contents (slurp filename)                      ;; see (1) below
        lines    (clojure.string/split contents #"\n") ;; see (2) below
        vectors  (mapv #(mapv str %) lines)]           ;; see (3) below
    vectors))
  • 步骤(1)将整个文件作为单个字符串加载到内存中
  • 步骤(2)以换行方式拆分文件
  • 第(3)步是魔术发生的地方:对于文件中的每一行(
    mapv…lines
    ),调用另一个(匿名)函数
    #(mapv str%)
    ,该函数迭代该行的每个字符并将它们转换为字符串(因此字符
    \\\\\
    成为字符串
    “\/code>),并将结果累加到向量中
我将您的输入文件保存为
input.txt
,并调用如下函数:

>  (clojure.pprint/pprint (read-vec-of-strings "input.txt"))

[["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"]
 ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"]
 ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"]
 ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"]
 ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"]
 ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"]
 ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"]
 ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
nil

最简单的是这样的:

(with-open [rdr (clojure.java.io/reader "data.txt")]
  (mapv vec (line-seq rdr)))
或者,如果需要字符串而不是字符:

(with-open [rdr (clojure.java.io/reader "data.txt")]
  (mapv #(clojure.string/split % #"") (line-seq rdr)))
元素向量的两个返回向量

(with-open [rdr (clojure.java.io/reader "data.txt")]
  (mapv #(clojure.string/split % #"") (line-seq rdr)))