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;