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: [email protected] en nombre de Carlos Agustín L. Avila Enviado el: mié 02/02/2011 17:42 Para: [email protected] 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 <[email protected]> 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<[email protected]>: >>>> >>>> Estimad@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 ([email protected]) > 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 ([email protected]) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
