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

From: Carlos Agustín L(dot) Avila <cagustinla(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Considerar '' como nulo en carga de datos desde csv
Date: 2011-02-02 16:42:00
Message-ID: AANLkTiktK1W9e-GLY1oXdmhACMS4EyhPYpnuC-QM9iiO@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 2 de febrero de 2011 10: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
>

Hola a todos.
Para estos casos lo que yo hago es crear 2 entidades, la primer la
defino con atributos de tipo varchar y la segunda conla estructura que
necesito.
Lugo a la primera actualizo los atributos: update tabla1 set col1=0
where nullvalue(col1)
Finalmente corro un insert en tabla2: insert into tabla2 (select * from tabla1);
Espero sirva de algo.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Patricio Cardenas Garay 2011-02-02 21:14:12 ayuda dejar postgres 9.0 como latin1
Previous Message Guillermo Villanueva 2011-02-02 16:25:59 Re: Considerar '' como nulo en carga de datos desde csv