J'ai un fichier texte comme indiqué ci-dessous:
[ ["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
Puis-je lire à partir du fichier d'entrée et obtenir une sortie dans ce format
[---#--###---- -#---#----##- ####-#-#-#-## ---#---#-#--- -#-####---##- -#------#---- -############ ------------@ ]
J'ai essayé de lire le fichier d'entrée ligne par ligne et de l'ajouter à un vecteur:
(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).
Cette approche me donne un vecteur de chaînes:
[ ["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"] ]
3 Réponses :
Allez-y étape par étape.
Lisez les données (comme le fichier est petit, il suffit de slurp). Nommons le fichier grid.txt
(->> (slurp "grid.txt")
(clojure.string/split-lines)
(map #(map str %))
(map vec)
(into []))
[["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
Découpez en lignes:
(->> (slurp "grid.txt")
(clojure.string/split-lines)
(map vec)
(into []))
[[\- \- \- \# \- \- \# \# \# \- \- \- \-] [\- \# \- \- \- \# \- \- \- \- \# \# \-] [\# \# \# \# \- \# \- \# \- \# \- \# \#] [\- \- \- \# \- \- \- \# \- \# \- \- \-] [\- \# \- \# \# \# \# \- \- \- \# \# \-] [\- \# \- \- \- \- \- \- \# \- \- \- \-] [\- \# \# \# \# \# \# \# \# \# \# \# \#] [\- \- \- \- \- \- \- \- \- \- \- \- \@]]
Convertissez chacun chaîne en vecteur de caractères:
(->> (slurp "grid.txt")
(clojure.string/split-lines)
(map vec))
([\- \- \- \# \- \- \# \# \# \- \- \- \-] [\- \# \- \- \- \# \- \- \- \- \# \# \-] [\# \# \# \# \- \# \- \# \- \# \- \# \#] [\- \- \- \# \- \- \- \# \- \# \- \- \-] [\- \# \- \# \# \# \# \- \- \- \# \# \-] [\- \# \- \- \- \- \- \- \# \- \- \- \-] [\- \# \# \# \# \# \# \# \# \# \# \# \#] [\- \- \- \- \- \- \- \- \- \- \- \- \@])
Convertir le niveau supérieur en vecteur:
(->> (slurp "grid.txt")
(clojure.string/split-lines))
["---#--###----" "-#---#----##-" "####-#-#-#-##" "---#---#-#---" "-#-####---##-" "-#------#----" "-############" "------------@"]
Notez que ce n'est pas la même chose que votre sortie attendue car les vecteurs internes contiennent des caractères, pas des chaînes.
Si vous vouliez vraiment des chaînes à la place, vous devez ajouter une ligne:
(slurp "grid.txt") "---#--###----\r\n-#---#----##-\r\n####-#-#-#-##\r\n---#---#-#---\r\n-#-####---##-\r\n-#------#----\r\n-############\r\n------------@"
Si vous pouvez vous permettre de charger tout le fichier d'entrée en mémoire, voici une fonction rapide et sale qui fait exactement cela:
> (clojure.pprint/pprint (read-vec-of-strings "input.txt")) [["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]] nil
mapv ... lines ), appelez une autre fonction (anonyme) # (mapv str%) qui parcourt chaque caractère de la ligne et les transforme en chaîne (ainsi le caractère \ # devient la chaîne "#" ), et accumule le résultat dans un vecteur. J'ai enregistré votre fichier d'entrée sous le nom input.txt et j'ai appelé la fonction comme ceci:
(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))
le plus simple serait quelque chose comme ceci:
(with-open [rdr (clojure.java.io/reader "data.txt")] (mapv #(clojure.string/split % #"") (line-seq rdr)))
ou au cas où vous auriez besoin de chaînes au lieu de caractères:
(with-open [rdr (clojure.java.io/reader "data.txt")] (mapv vec (line-seq rdr)))
les deux renvoient le vecteur de vecteurs d'éléments