Заставьте Clojure распознавать и изолировать строку в файле - PullRequest
5 голосов
/ 04 июля 2010

Я пытаюсь заставить Clojure прочитать файл, поместить первую строку в переменную, а остальные в другую переменную.Кажется, я не могу понять, как это сделать, и буду рад, если кто-нибудь подскажет мне,

Ответы [ 2 ]

4 голосов
/ 04 июля 2010
;; for Clojure 1.1
(require '[clojure.contrib.duck-streams :as io])
;; for bleeding edge
(require '[clojure.java.io :as io])

(with-open [fr (io/reader "/path/to/the/file")]
  (let [[first-line & other-lines] (doall (line-seq fr))]
    ;; do stuff with the lines below...
    ...))

Обновление: Ах, только что понял, что я взял "остальное" из вопроса, чтобы обозначить "остальные строки в файле", таким образом, в приведенном выше other-lines являетсяПоследовательность всех строк в файле, кроме первой.

Если вам нужна вместо этого «строка, содержащая остальное содержимое файла», вы можете использовать приведенный выше код, но тогда (require '[clojure.contrib.str-utils2 :as str]) / (require '[clojure.string :as str]) (в зависимости от используемой вами версии Clojure) и скажите (str/join "\n" other-lines), чтобы воссоединить other-lines в одну строку;или, альтернативно, используйте что-то вроде этого:

(let [contents (slurp "/path/to/the/file")
      [first-line rest-of-file] (.split #"\n" contents 2)]
  ...)
2 голосов
/ 04 июля 2010

Clojure head:

(require '[clojure.string :as str])
(let [[f & r] (str/split (slurp "foo.txt") #"\n")]
   ... do something with f and r ...)

ED: Каким-то образом я не смог распознать ответ Михала и подумал об его удалении, но, поскольку он немного отличается и показывает clojure.string.split, я не буду.

...