2010-06-02 4 views
11

Was wäre ein ideomatischer Weg in Clojure, eine träge Sequenz über eine Datei zu erhalten, die aus Java serialisierte Gleitkommawerte enthält? (Ich habe mit einem with-open Ansatz basierend auf Zeilenlese-Beispielen gespielt, aber kann nicht scheinen, die Punkte zu verbinden, um den Strom als Schwimmer zu verarbeiten.)Behandeln einer Datei von Java-Gleitkommazahlen als eine faule Clojure-Sequenz

Danke.

+0

Ein Float pro Zeile oder Tab-getrennt oder Leerzeichen getrennt? Können Sie einige Beispieldaten angeben? –

+0

Erläuterung: Die Datei besteht aus binären Serialisierungen von Java-Floats (d. H. Dem einfachen Typ "float"), sie ist nicht durch irgendetwas getrennt. Ich möchte eine Berechnung basierend auf jedem Eintrag in der (möglicherweise sehr großen) Datei machen - stellen Sie sich vor, ich möchte sie alle zusammenfassen. I.e. Ich möchte nur eine träge Sequenz über alle Werte. – Cumbayah

Antwort

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

Sie sind nicht verpflichtet, with-open zu verwenden, wenn Sie sicher sind, dass Sie die gesamte seq verbrauchen werden.

Wenn Sie With-Open verwenden, überprüfen Sie, dass Sie die Seq (oder eine abgeleitete Seq) nicht außerhalb ihres Gültigkeitsbereichs verlieren.

+0

Elegant. Vielen Dank. – Cumbayah

+0

Großartig: es beleuchtete den Gebrauch von Lazy-Seq in meinen Gedanken. Es hat endlich geklickt. –