Quiero copiar un archivo CSV a una tabla de Postgres. Hay alrededor de 100 columnas en esta tabla, por lo que no quiero reescribirlas si no es necesario.
Estoy usando el \copy table from 'table.csv' delimiter ',' csv;
comando pero sin una tabla creada obtengo ERROR: relation "table" does not exist
. Si agrego una tabla en blanco, no obtengo ningún error, pero no sucede nada. Probé este comando dos o tres veces y no hubo resultados ni mensajes, pero la tabla no se actualizó cuando la revisé a través de PGAdmin.
¿Hay alguna forma de importar una tabla con encabezados incluidos como estoy tratando de hacer?
postgresql
csv
postgresql-copy
Copa Stanley Phil
fuente
fuente
table
? Muy confuso. ¿Existe la tabla o desea crearla basándose en el CSV? (no puedes)\copy table(column1, column2, ...) from 'table.csv' delimiter ',' csv;
sin suerte. Idealmente, la tabla podría crearse solo a través del CSV y usar los encabezados en ese archivo.Respuestas:
Esto funcionó. La primera fila tenía nombres de columnas.
fuente
COPY
no crea una tabla ni le agrega columnas, agrega filas a una tabla existente con sus columnas existentes. Presumiblemente, el autor de la pregunta quiere automatizar la creación de las ~ 100 columnas yCOPY
no tiene esta funcionalidad, al menos a partir de PG 9.3.ADD
datos.syntax error at or near "HEADER" LINE 2: delimiter ',' CSV HEADER
un corrimiento al rojo aws.Con la biblioteca de Python
pandas
, puede crear fácilmente nombres de columna e inferir tipos de datos de un archivo csv.El
if_exists
parámetro se puede configurar para reemplazar o agregar a una tabla existente, por ejemplodf.to_sql('pandas_db', engine, if_exists='replace')
. Esto también funciona para tipos de archivos de entrada adicionales, documentos aquí y aquí .fuente
pd.read_excel
, en lugar depd.read_csv
. Actualicé la respuesta.df.to_sql()
es MUY LENTO, para acelerar esto puedes usar d6tstack . También se ocupa de los cambios de esquema.Alternativa por terminal sin permiso
La documentación pg en NOTES dice
Entonces, generalmente, usando
psql
o cualquier cliente, incluso en un servidor local, tiene problemas ... Y, si está expresando el comando COPY para otros usuarios, por ejemplo. en un README de Github, el lector tendrá problemas ...La única forma de expresar la ruta relativa con los permisos del cliente es utilizando STDIN ,
como se recuerda aquí :
psql -h remotehost -d remote_mydb -U myuser -c \ "copy mytable (column1, column2) from STDIN with delimiter as ','" \ < ./relative_path/file.csv
fuente
He estado usando esta función durante un tiempo sin problemas. Solo necesita proporcionar el número de columnas que hay en el archivo csv, y tomará los nombres de los encabezados de la primera fila y creará la tabla para usted:
create or replace function data.load_csv_file ( target_table text, -- name of the table that will be created csv_file_path text, col_count integer ) returns void as $$ declare iter integer; -- dummy integer to iterate columns with col text; -- to keep column names in each iteration col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet begin set schema 'data'; create table temp_table (); -- add just enough number of columns for iter in 1..col_count loop execute format ('alter table temp_table add column col_%s text;', iter); end loop; -- copy the data from csv file execute format ('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_file_path); iter := 1; col_first := (select col_1 from temp_table limit 1); -- update the column names based on the first row which has the column names for col in execute format ('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first) loop execute format ('alter table temp_table rename column col_%s to %s', iter, col); iter := iter + 1; end loop; -- delete the columns row // using quote_ident or %I does not work here!? execute format ('delete from temp_table where %s = %L', col_first, col_first); -- change the temp table name to the name given as parameter, if not blank if length (target_table) > 0 then execute format ('alter table temp_table rename to %I', target_table); end if; end; $$ language plpgsql;
fuente
set schema 'data';
a lo que sea para tiPuede usar d6tstack que crea la tabla para usted y es más rápido que pd.to_sql () porque usa comandos nativos de importación de DB. Es compatible con Postgres, así como con MYSQL y MS SQL.
También es útil para importar múltiples CSV, resolver cambios en el esquema de datos y / o preprocesar con pandas (por ejemplo, para fechas) antes de escribir en la base de datos, ver más abajo en el cuaderno de ejemplos.
fuente