@muzungu

Как прочитать файл построчно в Clojure с помощью line-seq и сохранить в вектор строки?

С банальной казалось бы задачей борюсь, прошу помочь.
Есть файл там три строки
1 0 0
0 1 0
0 0 1

Нужно его 1) прочитать 2) распарсить (я еще делаю trim каждой строки) и 3) собственно сохранить в вектор, например результат должен быть таким:
[1 0 0] [0 1 0] [0 0 1]

Вот пока дошел до такого кода:
(defn read-matrix-file
  [file]
  (with-open [rdr (clojure.java.io/reader file)]
    (doseq [line (line-seq rdr)]
      (let [result (conj [] (filter #(not= % \space) (trim line)))]
        (println result))
      )))

Печатает такой результат:
[(1 0 0)]
[(0 1 0)]
[(0 0 1)]
Как видите я просто вставил println что бы видеть что получилось, в конечном результате он не нужен.
Проблема в том, что (как мне кажется) я использую doseq, а он не возвращает результат. Хотя некоторые результат и сохраняется в форме let, но как его вытащить.
И в том, что тут line-seq ленивая.
Как все-таки построить и вернуть вектор (или список) из функции?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@muzungu Автор вопроса
Ответ мне подсказали в одном сообществе Clojure

(defn read-matrix
  [filename]
  (let [content (slurp filename)
        lines (str/split-lines content)]
    (mapv #(read-string (format "[%s]" %)) lines )))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы