Re: Considerar '' como nulo en carga de datos desde csv

From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: 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-02 16:25:59
Message-ID: AANLkTik5TOx+jxrtodVWFDyhGO0+ARPXBkYudLGzkka5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Rodrigo, te comento una alternativa.
Yo tuve que hacer algo parecido y lo resolví en mi caso en entorno win con
visual basic 6.
Abro el archivo para leer línea por línea.
Y abro un nuevo archivo para escritura.
Las líneas que cumplen las condiciones las voy guardando en el nuevo archivo
las que no cumplen simplemente las ignoro.
Para procesar unas 300000 líneas debe demorar unos 10 segundos y la
programación para el manejo de cada línea no es difícil.

Saludos

~~~~~~~~~~~~~~~~
Guillermo Villanueva

El 2 de febrero de 2011 13:06, Rodrigo Ruiz Fuentes <rruizf(at)gmail(dot)com>escribió:

> On 01/02/11 18:28, Jorge Tornero wrote:
>
>> Hola Rodrigo y resto del personal,
>>
>> lo que tú quieres hacer, bajo mi punto de vista, está pidiendo a gritos
>> sed y/o tr (doy por supuesto que trabajas en GNU/linux). Yo tenía un
>> problema similar con csv en los que el separador decimal era la coma y lo
>> tenía que cambiar a punto y con la orden sed o tr apropiada un fichero de
>> 60MB con 350000 registros se lo merienda en cosa de 0.7 segundos (de veras).
>> Además, te da igual que en los campos de texto no haya comillas, postgresql
>> te los importa igual, de manera que puedes seguir con el copy (más sencillo,
>> simplemente \copy data from 'mifichero.csv' with delimiter ';' csv header (o
>> con el comando COPY, lo que ocurre es que yo uso \copy en psql para evitar
>> rollos de permisos en directorios, etc...)
>>
>> Con sed:
>>
>> sed 's/\"//g'<ficheroentrada>ficherosalida
>>
>> y con tr:
>>
>> tr -d \"<ficheroentrada>ficherosalida
>>
>> (revísalos porque son de medio memorieta)
>>
>> El resultado es espectacular de veras. Adicionalmente, si trabajas en KDE
>> (no sé si Gnome lo permite), te puedes hacer un servicemenu de manera que
>> sólo tendrías que darle al botón derecho del ratón y seleccionar del menú
>> contextual tu acción (eliminar comillas o algo así, a tu gusto) de manera
>> que te sería todo mucho más sencillo. Es más, en tu propio script para el
>> servicemenu puedes incluir la llamada a psql con el comando \copy y ya te
>> haría la importación del tirón. Pero eso es otra historia...
>>
>> Un saludo, pruébalo y ya nos cuentas.
>>
>> [...]
>>
>>
>> 2011/2/1 Rodrigo Ruiz Fuentes<rruizf(at)gmail(dot)com>:
>>>
>>>> Estimad(at)s,
>>>> estoy importando datos desde un archivo CSV con formato definido, los
>>>> campos
>>>> vienen separados por punto y coma (;) y entre comillas dobles ("), estoy
>>>> ejecutando:
>>>>
>>>> COPY data FROM '/tmp/archivo.txt' WITH NULL AS '' DELIMITER ';' CSV
>>>> QUOTE
>>>> '"';
>>>>
>>>> Sin embargo, hay unos campos (latitud y longitud) que son tipo 'double
>>>> precision', y cuando esos datos vienen vacios (en CSV ""), no reconoce
>>>> el
>>>> tipo de dato y falla la carga, intenté como pueden ver con "NULL AS ''"
>>>> sin
>>>> embargo sigue fallando.
>>>> Estoy sobre PostgreSQL 8.4.X, y la pregunta es como puedo hacer para que
>>>> esos valores que vienen vacíos ("") los tome como null, en el diseño,
>>>> permite valores nulos.
>>>>
>>>> Intentar es una editar directamente el archivo sería muy engorroso, pues
>>>> pesa mucho y son como 14 millones de registros semanales, y el archivo
>>>> llega
>>>> cada semana.
>>>>
>>>> Saludos cordiales.-
>>>>
>>>
> 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 (;).
>
> Saludos!
>
>
> --
> Rodrigo Ruiz Fuentes
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Carlos Agustín L. Avila 2011-02-02 16:42:00 Re: Considerar '' como nulo en carga de datos desde csv
Previous Message Rodrigo Ruiz Fuentes 2011-02-02 16:06:17 Re: Considerar '' como nulo en carga de datos desde csv