sql >> Base de Datos >  >> RDS >> PostgreSQL

¿COPIAR solo algunas columnas de un CSV de entrada?

No sé de dónde sacaste esa sintaxis, pero COPY no toma una lista de alias de columna como esa. Ver la ayuda:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

(AS no es una de las opciones enumeradas; para ver la salida completa, ejecute \d copy en psql, o mira el manual para la copy comando en línea).

No hay función de mapeo en COPY eso le permite leer solo algunas columnas del CSV de entrada. Sería realmente útil, pero nadie ha tenido el tiempo/interés/financiamiento para implementarlo todavía. En realidad, es solo una de las muchas tareas de filtrado/transformación de datos que la gente quiere de todos modos.

PostgreSQL espera la lista de columnas dada en COPY estar en el mismo orden, de izquierda a derecha, que lo que está en el archivo CSV, y tener la misma cantidad de entradas que columnas tiene el archivo CSV. Así que si escribes:

COPY con (date,kgs)

entonces PostgreSQL esperará un CSV de entrada con exactamente dos columnas . Usará la primera columna csv para el "date" columna de tabla y la segunda columna csv para "kgs" columna de la tabla No importa cuáles sean los encabezados CSV, se ignoran si especifica WITH (FORMAT CSV, HEADER ON) , o tratados como filas de datos normales si no especifica HEADER .

PostgreSQL 9.4 agrega FROM PROGRAM para COPY , por lo que podría ejecutar un comando de shell para leer el archivo y filtrarlo. Una simple secuencia de comandos de Python o Perl haría el trabajo.

Si es un archivo pequeño, simplemente abra una copia en la hoja de cálculo de su elección como un archivo csv, elimine las columnas no deseadas y guárdelo, solo la date y kgs quedan columnas.

Alternativamente, COPY a una tabla de preparación que tiene todas las mismas columnas que el CSV , luego haz INSERT INTO ... SELECT para transferir solo los datos deseados a la tabla de destino real.