Skip site navigation (1) Skip section navigation (2)

Re: Considerar '' como nulo en carga de datosdesde csv

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 datosdesde csv
Date: 2011-02-09 16:32:40
Message-ID: 20110209163240.GF9100@gwolf.org (view raw or flat)
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,

In response to

pgsql-es-ayuda by date

Next:From: Gunnar WolfDate: 2011-02-09 16:37:40
Subject: Re: [pgsql-es-ayuda] Dilema con Strroed procedures en Postgres
Previous:From: Rafael MartinezDate: 2011-02-09 13:31:45
Subject: Re: Controlador JDBC pg 9

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group