прочитать файл в список, каждый элемент представляет одну строку файла - PullRequest
3 голосов
/ 28 января 2012

Вкратце, как мне прочитать файл в последовательность, где каждая строка представляет собой один элемент в последовательности.Итак, я хотел бы увидеть определение функции get-lines, чтобы я мог сделать следующее:

(def lines (get-lines "test.txt"))

и строки - это не ленивая последовательность.

Ответы [ 3 ]

10 голосов
/ 02 февраля 2012

Альтернативная реализация:

(require ['clojure.string :as 'str])

(defn get-lines [file]
  (str/split-lines (slurp file)))

Эта функция возвращает вектор результатов вместо последовательных.

Если вы не используете 1.3, вместо этого требуется clojure.contrib.string.

8 голосов
/ 29 января 2012

Чтобы преобразовать ленивую последовательность в не ленивую, вы можете использовать doall примерно так:

(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))
2 голосов
/ 28 января 2012

Вы можете использовать line-seq.Быстрый пример:

(ns your.project
  (:require [clojure.java.io :as io]))

(defn count-lines [filename]
  (with-open [rdr (io/reader filename)]
    (count (line-seq rdr))))

Обратите внимание, что line-seq это lazy .Вы должны быть осторожны, чтобы не использовать последовательность после , когда считыватель закрыт.Следующее не будет работать:

(def lines (with-open [rdr (io/reader "some-file")]
             (line-seq rdr)))

(println (first lines))

Первый пример работает, потому что count не ленив.

Если вы хотите что-то сделать (с побочными эффектами) со строками, которые вы 'Возможно, вы найдете doseq наиболее полезными:

;; copy every "short" line in file
(with-open [rdr (io/reader from)
            wrt (io/writer to)]
  (binding [*out* wrt]
    (doseq [line (line-seq rdr) :when (< (count line) 10)]
      (println line))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...