From: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
---|---|
To: | Rodrigo Ruiz Fuentes <rruizf(at)gmail(dot)com> |
Cc: | Jorge Tornero <jorge(dot)tornero(at)cd(dot)ieo(dot)es>, francisco(dot)morosini(at)gmail(dot)com, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Considerar '' como nulo en carga de datos desde csv |
Date: | 2011-02-09 16:32:40 |
Message-ID: | 20110209163240.GF9100@gwolf.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Rodrigo Ruiz Fuentes dijo [Wed, Feb 02, 2011 at 01:06:17PM -0300]:
> OK, agradezco tu ayuda, bueno, definitivamente utilicé el comando
> entregado con sed (no soy bueno con dicha herramienta) y limpia el
> archivo, primero intenté quitando todas las comillas dobles, luego saque
> el QUOTE del COPY, pero aún así me arroja errores, luego reemplacé todas
> los "" por "\N" para que los considerara como nulos, pero continúa dando
> errores.
> Definitivamente, he decidido que no me sirve de lada tener un dato nulo
> en una longitud o latitud, por lo tanto eliminaré la linea si uno de
> dichos campos es vacio ("" especificamente)... como señalé antes no
> manejo bien sed ni expresiones regulares, si pudieran ayudarme a hacer
> esta operación, estaría agradecido, se que quizás no es la lista
> apropiada, de otro modo lanzo la pregunta a una de linux..
> El archivo CSV tiene en las posiciones 4 y 5, latitud y longitud
> respectivamente, entonces habría que procesar el archivo, buscar en
> dichas posiciones valores "" y eliminar la linea... no me sirve buscar
> en toda la linea, pues hay campos de texto que si podrían ser "", los
> campos estan delimitados por punto y coma (;).
Puede servirte algo como lo siguiente:
cat datos | perl -n -e '@lin=split/;/; next if $lin[3] eq q("") or $lin[4] eq q(""); print join(";",@lin)'
No lo probé, pero debe funcionar. Vamos, eso de que hacer "un
programa" para procesar tus datos... No es tan pesado como suena ;-)
En este caso, la línea que te presento se traduce a:
- El switch -e de perl le indica que no lea el programa del disco,
sino que se lo paso a continuación↓
- El switch -n de perl indica que llame al programa que le especificas
(en este caso, lo que sigue al '-e') repetidamente, entregándole el
archivo línea por línea.
- @lin = split /;/ - Toma los datos de la línea en cuestión (que
están en la variable default, $_, que puede omitirse) y los separa
por el caracter ';', guardando el resultado en el arreglo @lin
- Si el cuarto o quinto elemento de @lin (recuerda que el primer
elemento es [0]) son iguales a la cadena '""', omite la línea y pasa
a la siguiente. Claro, no usé '""' porque estoy ya dentro de
comillas sencillas - Es equivalente a usar q("").
- Por último, imprime @lin, unido por el caracter ";"
Claro, por ahí podría ser más limpio asignar al principio a una
variable con permanencia (digamos, iniciar con "$lin = $_; @lin =
split..."), y al final imprimir $lin en vez de juntarlo de
vuelta... Queda a tu discreción.
Saludos,
From | Date | Subject | |
---|---|---|---|
Next Message | Gunnar Wolf | 2011-02-09 16:37:40 | Re: [pgsql-es-ayuda] Dilema con Strroed procedures en Postgres |
Previous Message | Rafael Martinez | 2011-02-09 13:31:45 | Re: Controlador JDBC pg 9 |