2010-06-02 12 views
11

Quale sarebbe un modo ideologico in Clojure per ottenere una sequenza lenta su un file contenente valori float serializzati da Java? (Ho giocato con un approccio with-open basato su esempi di lettura linea, ma non riesco a collegare i punti per elaborare il flusso come float.)Trattare un file di Java fluttua come una sequenza di Clojure pigro

Grazie.

+0

Un galleggiante per linea o separato da tabulazione o separato da spazio? Puoi dare qualche esempio di dati? –

+0

Chiarimento: il file è costituito da serializzazioni binarie di float Java (ad esempio il tipo semplice "float"), non è separato da nulla. Voglio fare un calcolo basato su ogni voce nel file (potenzialmente molto grande) - immagina di voler sommare tutti. Cioè Voglio solo una sequenza pigra su tutti i valori. – Cumbayah

risposta

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)))) 

Non è necessario utilizzare con-open se si è sicuri di consumare l'intero seq.

Se si utilizza con-open, ricontrollare che non si sta perdendo il seq (o un seq derivato) al di fuori del suo ambito.

+0

Elegante. Grazie. – Cumbayah

+0

Grande: ha illuminato l'uso del lazy-seq nella mia mente. Finalmente ha cliccato. –

Problemi correlati