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