2010-07-03 9 views

cevap

4
;; 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... 
    ...)) 

Güncelleme: Ah, demek sorudan "dinlenme" aldığını fark etti "dosyadaki satırların geri kalanı", dolayısıyla yukarıdaki other-lines'da, dosyadaki ilk satır dışındaki tüm satırların bir sırasıdır. other-lines yeniden katılma (str/join "\n" other-lines) Eğer gerekiyorsa

"dosyanın içeriğinin geri kalanını içeren bir dize" yerine, yukarıdaki kodu kullanabilirsiniz, ama sonra/(require '[clojure.string :as str])(require '[clojure.contrib.str-utils2 :as str]) (kullandığınız Clojure sürümüne bağlı olarak) ve de ki tek bir dizgeye;

(let [contents (slurp "/path/to/the/file") 
     [first-line rest-of-file] (.split #"\n" contents 2)] 
    ...) 
2

Clojure kafa:

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

ED: ya alternatif olarak böyle bir şey kullanmak nasılsa Michal cevabını tanımak için başarısız oldu ve onu silme hakkında düşündüm, ama biraz farklı ve beri Clojure gösterir .string.split, yapmayacağım.

+0

Bunu bir dosyaya verdiğimde, dosyanın bir yerine [\ aldım. Neden biliyor musun? – bleakgadfly

+0

Bu çözümde, slurp tarafından döndürülen dize satırlara bölünür. Bu, (str/split str # "\ n") satırların bir vektörünü döndüreceği anlamına gelir. Daha sonra, ilk satır f'ye ve vektörün geri kalanı r'ye bağlanır. Michał'in cevabının ikinci paragrafına da bakın. – danlei

+0

Çözümü denedim ve yaptım (println (str f r)). İlk satır mükemmel ama geri kalanlar parantez (yazım hatası) ve tırnak işaretleri içinde. Bu gibi: Bu ilk satırdır. ("" "Ve bu" "diğer satırlar"). Parantez ve alıntılardan kurtulmanın herhangi bir yolu var mı? Michaels çözümünün bu problemi nasıl çözdüğünü görün. – bleakgadfly