postgres into from examples example ejemplo create postgresql csv postgresql-copy

into - ¿Cómo copiar de un archivo CSV a una tabla PostgreSQL con encabezados en un archivo CSV?



postgresql copy format csv (4)

Alternativa por terminal sin permiso

La documentación de pg en NOTES dice

La ruta se interpretará en relación con el directorio de trabajo del proceso del servidor (normalmente el directorio de datos del clúster), no el directorio de trabajo del cliente.

Entonces, geralmente, el uso de psql o cualquier cliente, incluso en un servidor local, tiene problemas ... Y, si está expresando el comando COPY para otros usuarios, ej. en un README de Github, el lector tendrá problemas ...

La única forma de expresar la ruta relativa con los permisos del cliente es usar STDIN ,

Cuando se especifica STDIN o STDOUT, los datos se transmiten a través de la conexión entre el cliente y el servidor.

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

Quiero copiar un archivo CSV a una tabla de Postgres. Hay alrededor de 100 columnas en esta tabla, por lo que no quiero volver a escribirlas si no es necesario.

Estoy usando la /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 salida ni mensajes, pero la tabla no se actualizó cuando lo revisé mediante PGAdmin.

¿Hay alguna manera de importar una tabla con encabezados incluidos como lo estoy intentando hacer?


Con los pandas biblioteca Python, puede crear fácilmente nombres de columna e inferir tipos de datos de un archivo csv.

from sqlalchemy import create_engine import pandas as pd engine = create_engine(''postgresql://user:pass@localhost/db_name'') df = pd.read_csv(''/path/to/csv_file'') df.to_sql(''pandas_db'', engine)

El parámetro if_exists se puede establecer para reemplazar o agregar a una tabla existente, por ejemplo df.to_sql(''pandas_db'', engine, if_exists=''replace'') . Esto también funciona para tipos de archivos de entrada adicionales, here y here .


Esto funcionó. La primera fila tenía nombres de columna.

COPY wheat FROM ''wheat_crop_data.csv'' DELIMITER '';'' CSV HEADER


He estado usando esta función por un tiempo sin problemas. Solo necesita proporcionar las columnas numéricas que hay en el archivo csv, y tomará los nombres de los encabezados de la primera fila y creará la tabla por 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;