2010-06-02 14 views
11

Jaki byłby ideologiczny sposób w Clojure, aby uzyskać leniwą sekwencję pliku zawierającego wartości zmiennopoziomowe serializowane z Javy? (Bawiłem się podejściem with-open opartym na przykładach czytania linii, ale nie potrafię połączyć kropek, aby przetworzyć strumień jako pływaki.)Traktowanie pliku Javy jako leniwa sekwencja Clojure

Dzięki.

+0

Jedna zmiennoprzecinkowa na linię, oddzielona tabulatorami lub rozdzielona spacjami? Czy możesz podać przykładowe dane? –

+0

Wyjaśnienie: Plik składa się z binarnych serializacji Java float (tzn. Prostego typu "float"), nie jest oddzielony przez nic. Chcę wykonać obliczenia na podstawie każdego wpisu w pliku (potencjalnie bardzo dużym) - wyobraź sobie, że chcę je wszystkie zsumować. To znaczy. Chcę tylko leniwej sekwencji wszystkich wartości. – Cumbayah

Odpowiedz

15
(defn float-seqs [#^java.io.DataInputStream dis] 
    (lazy-seq 
    (try 
     (cons (.readFloat dis) (float-seqs dis)) 
     (catch java.io.EOFException e 
     (.close dis))))) 

(with-open [dis (-> file java.io.FileInputStream. java.io.DataInputStream.)] 
    (let [s (float-seqs dis)] 
    (doseq [f s] 
     (println f)))) 

Nie musisz używać opcji-open, jeśli masz pewność, że zużyjesz całą sekwencję.

Jeśli używasz opcji open, sprawdź dokładnie, czy nie wyciekłeś seq (lub pochodnej seq) poza jej zakresem.

+0

Elegancki. Dziękuję Ci. – Cumbayah

+0

Świetnie: to oświetliło użycie lazy-seq w moim umyśle. W końcu kliknął. –

Powiązane problemy