Reformateando datos de Clicom con AWK

El comisión nacional de agua (CNA) de Mexico tradionalmente mantuvo los datos climatalogicos en un herramienta informatica llamado “CLicom”. Todavia se encuentran datos en este formato anticuado. La exportación de Clicom produce tablas de esta forma.

¡Este no es facil de entrar en PostGIS! Pero el formato es consistente. Siempre cuando se trata de datos consistentes hay formas “faciles” de reformatearlos (¡si sabes como!). En este caso uno de los mejores herramientas es AWK.

Unos pocos lineas de AWK cambia el formato a algo mas amigable.

awk -F"," '
$1 ~ /Numero/ {Station=substr($1,10,8)}
$1 ~ "[0-9][0-9]..-.." {
for ( x = 1; x <= 31; x++ ){
if($(x+1)Prec.txt

Awk es muy conciso porque el trabajo de leerlos datos linea por linea ya esta implicito en el programa.

awk -F"," '

Significa que vamos a usar commas para la seperación

$1 ~ /Numero/ {Station=substr($1,10,8)}

Dice que si el primer campo contiene Numero entonces pon la segunda parte del campo en un variable llamado “Station”.

$1 ~ “[0-9][0-9]..-..” {

Este linea pregunta si el primer campo tiene un formato con dos digitos seguido por dos de cualquier carácter, un guión y dos mas caracteres. O sea el formato con las lineas que empiezan con una fecha. Estas lineas tienen los datos.

for ( x = 1; x <= 31; x++ ){
if($(x+1)<-9999){$(x+1)=”NA”}
print Station, “\t”,$1,”\t”,x,”\t”,$(x+1),”\t”,”\r”}

Este bloque imprime primero la fecha, luego el dia y después los valores de cada campo hasta 31 sustituyendo “NA” por campos vacios, o sea los que no tienen datos porque falta un dia o los meses con menos de 31 dias.

}' TEMPERATURA-MIN.CSV>TMin.txt

Finalmente se transfiere los resultados a un archivo de texto llamado Tmin.txt.

Awk procesa los datos rapidamente (en 3 segundos para un archivo de 20 MB) produciendo un resultado como este

Luego up poco de trabajo en R para quitar fechas ilegales como el 31 de feberero.

d1<-read.table("Prec.txt",colClasses=c("integer","character","numeric","numeric"))
d1<-na.omit(d1)
d1$V2<-paste(d1$V2,"-",formatC(d1$V3,width=2,flag="0"),sep="")
d1<-d1[,-3]
names(d1)<-c("Station","Date","Prec")
d1$Date<-as.Date(d1$Date)
d1<-data.frame(id=1:length(d1$Station),d1)
d1<-na.omit(d1)
write.table(d1,"/home/duncan/prec.csv",row.names=FALSE,col.names=FALSE,sep=",")

Y se puede importar a una tabla.

create table cna.prec
(
id serial NOT NULL,
station integer,
fecha date,
prec float,</code>

CONSTRAINT prec_pkey PRIMARY KEY(id )
)
;

COPY cna.prec FROM '/home/duncan/prec.csv' DELIMITERS ',' CSV;

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s