Escribo un pequeño analizador en clojure para fines de aprendizaje. básicamente es un analizador de archivos TSV que debe colocarse en una base de datos, pero agregué una complicación. La complicación en sí es que en el mismo archivo hay más intervalos. El archivo se ve así:Análisis de datos con Clojure, problema de intervalo
###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
que terminó con este código:
(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))
Mi idea es que en el 'proceso de línea' intervalo necesita ser combinado con los datos, así que tengo algo así como esto:
('andreadipersio', '2010-03-19', '16:10:00', 'root', 'launchd', 1, 0, 0.0, 0.0, '2:46.97')
por cada fila hasta el siguiente intervalo, pero no sé cómo hacer que esto suceda.
me trataron con algo como esto:
(def process-line
[line]
(if is-header? line)
(def header-data (extract-fields line header-pattern)))
(cons header-data (extract-fields line data-pattern)))
Pero esto no funciona como exceptuado.
¿Alguna pista?
Gracias!
Por cierto, no use 'def' excepto en el nivel superior a menos que realmente sepa lo que está haciendo! Y ciertamente nunca lo use para almacenamiento mutable. Use un Ref o Atom en su lugar. –
¡Gracias, esta es una preciosa pista! –
Espero que estés de acuerdo con que esta pregunta se convierta en la base de un ejercicio en rubylearning.org (para el curso Clojure 101). Encuentro que es un problema muy bueno para trabajar. –