jueves, 27 de enero de 2011

Migrar datos desde un archivo txt o csv a PostgreSql con el comando Copy

Muchas veces tenemos la necesidad de cargar datos a una tabla de nuestra base de datos en postrgesql desde un archivo ya sea de texto o un csv, para que esto no sea un dolor de cabeza y sea rapido ya que algunas herramientas lo logran pero tardan demasiado, podemos apoyarnos del comando Copy, que es un comando nativo de PostgreSql que podemos utilizar desde una terminal pgsql.

La sintaxis la podemos encontrar rapidamente con \h desde la terminal y su uso es muy sencillo, como todo comando basicamente es origen - destino veamos el patròn:

test=# copy (column1,column2,column3...) from '/ruta/nombre_archivo.csv' DELIMITERS ',' CSV;

Practicamente esto seria todo lo necesario para migrar los datos de una forma sencilla y rapida, expliquemos un poco de que se trata:

La primer parte es mi terminal psql: test=# (la cual accedo desde un shel con el comando psql -U usuario -d BaseDeDatos)

Posteriormente viene el comando copy: se compone de varias partes que en la ayuda del comando vienen (
\h copy desde la terminal psql) despues de la palabra copy colocamos las columnas de nuestra base de datos en donde caeran los datos del archivo el orden que useamos sera como se insertaran las columnas de nuestro archivo, mas adelante un ejemplo, podemos tambien omitir poner los nombres de las columnas esto indica que todo el archivo se cargara tal cual viene sobre las columnas que tengamos en la base de datos, osease ira cargando columna del archivo columna de la tabla y asi sucesivamente, despues viene la palabra from y posteriormente la ruta del archivo usamos la palabra Delimiters para indicar como esta delimitado nuestro archivo puede ser tabuladores ('\t'), comas, punto y coma o lo que sea que tengamos el archivo, indicamos el formato y listo esto hará magia en cargar miles o millones de datos en segundos o quiza minutos.

Ahora vemos un ejemplo funcional:

test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV;

Y en segundos o minutos(depende el tamaño de tu archivo) tendremos los datos de nuestro archivo dentro de nuestra base de datos. Cabe mencionar que los datos que ingresemos de esta forma se colocan al final de la tabla es decir si tenemos registros previos en esta tabla, no son afectados y mas bien son anexados al final de la tabla.

Quitar Encabezados

Tambien es importante mencionar que algunos archivos tienen encabezados, por ejemplo no solo vienen los datos sino tambien los encabezados como name, surname, address etc... podemos usar la opcion header para que los ignore quedando de la siguiente manera:

test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV header;

Con esto al hacer la migracion los encabezados de nuestro archivo seran ignorados.

Por último no olviden que los comandos como select, delete... etc.. incluso copy en psql finalizan con ";" a mi siempre se me olvida ponerlo.

2 comentarios:

engineering dijo...

como hago para insertar datos con copy table from stdin o como inserto estos datos

por ejemple

copy table(d1, d2, d3) from stdin;
1,ciudad,3
1,pais,3
1,datos,3

engineering dijo...

como hago para insertar datos con copy table from stdin o como inserto estos datos

por ejemple

copy table(d1, d2, d3) from stdin;
1,ciudad,3
1,pais,3
1,datos,3