Можно ли прочитать из входного файла и преобразовать каждую строку текстового файла в вектор строк? - PullRequest
2 голосов
/ 29 мая 2019

У меня есть текстовый файл, как показано ниже:

---#--###----
-#---#----##-
####-#-#-#-##
---#---#-#---
-#-####---##-
-#------#----
-############
------------@

Могу ли я прочитать из входного файла и получить вывод в этом формате

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

Я попытался прочитать входной файл построчно и добавить в вектор:

    (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).

Этот подход дает мне вектор строк:

[---#--###---- 
 -#---#----##- 
 ####-#-#-#-## 
 ---#---#-#--- 
 -#-####---##- 
 -#------#---- 
 -############ 
 ------------@
]

Я хочу вектор в этом формате:

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

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Шаг за шагом.

Чтение данных (так как файл маленький, просто хлебать). Назовем файл 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 []))
[["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"] ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"] ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"] ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"] ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"] ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"] ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"] ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
0 голосов
/ 29 мая 2019

самое простое будет что-то вроде этого:

(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)))

оба возвращают вектор векторов элементов

0 голосов
/ 29 мая 2019

Если вы можете позволить себе загрузить весь входной файл в память, вот простая и быстрая функция, которая делает именно это:

(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))
  • Step (1) загружает весь файл как* одна строка в памяти;
  • Шаг (2) разбивает файл на новые строки;
  • Шаг (3) - это место, где происходит волшебство: для каждой строки в файле (mapv ... lines),Вызовите другую (анонимную) функцию #(mapv str %), которая выполняет итерацию по каждому символу строки и превращает их в строку (поэтому символ \# становится строкой "#"), и накапливает результат в векторе.

Я сохранил ваш входной файл как input.txt и вызвал функцию следующим образом:

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

[["-" "-" "-" "#" "-" "-" "#" "#" "#" "-" "-" "-" "-"]
 ["-" "#" "-" "-" "-" "#" "-" "-" "-" "-" "#" "#" "-"]
 ["#" "#" "#" "#" "-" "#" "-" "#" "-" "#" "-" "#" "#"]
 ["-" "-" "-" "#" "-" "-" "-" "#" "-" "#" "-" "-" "-"]
 ["-" "#" "-" "#" "#" "#" "#" "-" "-" "-" "#" "#" "-"]
 ["-" "#" "-" "-" "-" "-" "-" "-" "#" "-" "-" "-" "-"]
 ["-" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"]
 ["-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "-" "@"]]
nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...