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

From: "Jorge Tornero" <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
To: Carlos Agustín L(dot) Avila <cagustinla(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 22:55:56
Message-ID: 7BDD1998D03D9A4B9DAD0038863D30AF2DE669@ieocadizb.cd.ieo.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pues sería cosa entonces, en caso de hacerlo con comandos linux, de awk, a ver si me lo repaso y os digo algo. Por otro lado... ¿y si se empleara un trigger para efectuar la conversion de varchar a número? No tengo muy claro que esto sea posible, pero sería lo mejor.

En cuanto a hacer un parser, python va muy bien para eso y maneja las conexiones con postgresql fenomenal (y es muy sencillo)

Jorge Tornero
Centro Oceanográfico de Cádiz
Instituto Español de Oceanografía
Muelle de Levante, s/n
Puerto Pesquero - Cadiz

-----Mensaje original-----
De: pgsql-es-ayuda-owner(at)postgresql(dot)org en nombre de Carlos Agustín L. Avila
Enviado el: mié 02/02/2011 17:42
Para: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] Considerar '' como nulo en carga de datos desde csv

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.
-
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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martín Marqués 2011-02-03 11:23:16 Re: ayuda dejar postgres 9.0 como latin1
Previous Message Patricio Cardenas Garay 2011-02-02 21:14:12 ayuda dejar postgres 9.0 como latin1