Sto scrivendo un piccolo parser in clojure a scopo di apprendimento. fondamentalmente è un parser di file TSV che deve essere inserito in un database, ma ho aggiunto una complicazione. La complicazione stessa è che nello stesso file ci sono più intervalli. Il somigli a quanto segue:Analisi dei dati con Clojure, problema con intervallo
###andreadipersio 2010-03-19 16:10:00###
USER COMM PID PPID %CPU %MEM TIME
root launchd 1 0 0.0 0.0 2:46.97
root DirectoryService 11 1 0.0 0.2 0:34.59
root notifyd 12 1 0.0 0.0 0:20.83
root diskarbitrationd 13 1 0.0 0.0 0:02.84`
....
###andreadipersio 2010-03-19 16:20:00###
USER COMM PID PPID %CPU %MEM TIME
root launchd 1 0 0.0 0.0 2:46.97
root DirectoryService 11 1 0.0 0.2 0:34.59
root notifyd 12 1 0.0 0.0 0:20.83
root diskarbitrationd 13 1 0.0 0.0 0:02.84
ho finito con questo codice:
(defn is-header?
"Return true if a line is header"
[line]
(> (count (re-find #"^\#{3}" line)) 0))
(defn extract-fields
"Return regex matches"
[line pattern]
(rest (re-find pattern line)))
(defn process-lines
[lines]
(map process-line lines))
(defn process-line
[line]
(if (is-header? line)
(extract-fields line header-pattern))
(extract-fields line data-pattern))
La mia idea è che in 'processo-line' intervallo deve essere fusa con i dati così ho qualcosa di simile this:
('andreadipersio', '2010-03-19', '16:10:00', 'root', 'launchd', 1, 0, 0.0, 0.0, '2:46.97')
per ogni riga fino all'intervallo successivo, ma non riesco a capire come farlo accadere.
Ho provato con qualcosa di simile:
(def process-line
[line]
(if is-header? line)
(def header-data (extract-fields line header-pattern)))
(cons header-data (extract-fields line data-pattern)))
Ma questo non funziona come eccettuato.
Eventuali suggerimenti?
Grazie!
BTW, non usare 'def' eccetto che al primo livello a meno che tu non sappia davvero cosa stai facendo! E certamente non lo uso mai per la memorizzazione mutevole. Usa invece un Ref o Atom. –
Grazie, questo è un suggerimento prezioso! –
Spero che tu stia bene con questa domanda diventando la base per un esercizio su rubylearning.org (per il corso Clojure 101)? Trovo che sia un bel problema su cui lavorare. –