Arreglando archivos csv rotos usando awk
Tengo algunos archivos csv que están rotos porque hay basura, como caracteres de control, entradas y delimitadores en algunos de los campos. Un ejemplo de datos de maqueta sin caracteres de control:
id;col 1;col 2;col 3
1;data 11;good 21;data 31
2;data 12;cut
in two;data 32
3;data 13;good 23;data 33
4;data 14;has;extra delimiter;data 34
5;data 15;good 25;data 35
6;data 16;cut
and;extra delimiter;data 36
7;data 17;data 27;data 37
8;data 18;cut
in
three;data 38
9;data 19;data 29;data 39
Estoy procesando la basura anterior con awk:
BEGIN { FS=OFS=";" } # delimiters
NR==1 { nf=NF; } # header record is fine, use the NF
NR>1 {
if(NF<nf) { # if NF less that header's NF
prev=$0 # store $0
if(getline==1) { # read the "next" line
succ=$0 # set the "next" line to succ
$0=prev succ # rebuild a current record
}
}
if(NF!=nf) # if NF is still not adequate
$0=succ # expect original line to be malformed
if(NF!=nf) # if the "next" line was malformed as well
next # well skip "next" line and move to next
} 1
Naturalmente, el programa anterior fallará en los registros4
y6
(ya que los datos reales tienen varios campos donde el delimitador adicional puede estar al acecho) y8
(ya que solo leo la siguiente línea siNF
es demasiado corto. Puedo vivir perdiendo4
y6
pero8
podría ser factible?
Además, tres sucesivosif
s grito por unfor
bucle pero es viernes por la tarde aquí y mi día se acerca$
y ya no puedo girar la cabeza. ¿Tienen alguna reserva cerebral que me pueda prestar? ¿Alguna mejor práctica que no haya pensado?