Como importar os dados do ficheiro CSV para uma tabela PostgreSQL?

Como posso escrever um procedimento armazenado que importa dados de um arquivo CSV e popula a tabela?

Author: Erwin Brandstetter, 2010-06-07

13 answers

Olha para este pequeno artigo .


Solução parafraseada aqui:

Criar a sua mesa:

CREATE TABLE zip_codes 
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);

Copiar os dados do seu ficheiro CSV para a tabela:

COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
 681
Author: Bozhidar Batsov, 2017-08-11 07:16:55

Se não tiver permissão para usar COPY (que funciona no servidor db), pode usar \copy em vez disso (que funciona no cliente db). Usando o mesmo exemplo que Bozhidar Batsov:

Criar a sua mesa:

CREATE TABLE zip_codes 
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);

Copiar os dados do seu ficheiro CSV para a tabela:

\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV

Também pode indicar as colunas a ler:

\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
 151
Author: bjelli, 2017-01-27 09:02:52

Uma maneira rápida de fazer isso é com a biblioteca Python pandas (versão 0.15 ou acima funciona melhor). Isto irá lidar com a criação das colunas para você - embora obviamente as escolhas que ele faz para os tipos de dados podem não ser o que você quer. Se ele não fizer bem o que você quer, você pode sempre usar o código 'Criar tabela' gerado como um modelo.

Aqui está um exemplo simples:

import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces

from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')

df.to_sql("my_table_name", engine)

E aqui está um código que mostra como definir várias opções:

#Set is so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

df.to_sql("my_table_name2", 
          engine, 
          if_exists="append",  #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
          index=False, #Do not output the index of the dataframe
          dtype={'col1': sqlalchemy.types.NUMERIC,
                 'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
 61
Author: RobinL, 2016-02-06 10:01:43

Você também pode usar o pgAdmin, que oferece uma interface gráfica para fazer a importação. Isso é mostrado neste tópico Então . A vantagem de usar o pgAdmin é que ele também funciona para Bancos de dados remotos.

Muito parecido com as soluções anteriores, porém, você precisa ter sua tabela na base de dados já. Cada pessoa tem sua própria solução, mas o que eu normalmente faço é abrir o CSV no Excel, copiar os cabeçalhos, Colar especial com transposição em uma folha de trabalho diferente, colocar o tipo de dados correspondente na coluna seguinte, basta copiar e colar isso para um editor de texto, juntamente com a pesquisa de criação de tabela SQL apropriada, como por exemplo:

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)
 27
Author: Paul, 2017-05-23 11:47:28

Como o Paul mencionou, obras de importação em pgAdmin:

Carregue com o botão direito na tabela - > importar

Seleccione o ficheiro local, o formato e a codificação

Aqui está uma imagem gráfica alemã pgAdmin:

pgAdmin import GUI

Algo semelhante que você pode fazer com o Dbvisualiser (eu tenho uma licença, Não tenho certeza sobre a versão gratuita)

Carregue com o botão direito numa tabela -> importar os dados da tabela...

DbVisualizer import GUI

 19
Author: Andreas L., 2015-10-21 13:37:41

A maioria das outras soluções aqui requer que você crie a tabela com antecedência/manualmente. Isto pode não ser prático em alguns casos (por exemplo, se você tem um monte de colunas na tabela de destino). Então, a aproximação abaixo pode ser útil.

Se indicar a localização e a contagem de colunas do seu ficheiro csv, poderá usar a seguinte função para carregar a sua tabela para uma tabela temporária que será nomeada como target_table:

Assume-se que a linha superior tem os nomes das colunas.

create or replace function data.load_csv_file
(
    target_table text,
    csv_path text,
    col_count integer
)

returns void as $$

declare

iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet

begin
    set schema 'your-schema';

    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_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
    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;
 17
Author: mehmet, 2017-06-23 17:01:10
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
 14
Author: Tim Siwula, 2016-11-16 19:21:03
Experiência pessoal com PostgreSQL, ainda à espera de um caminho mais rápido.

1. Criar primeiro o esqueleto da tabela se o ficheiro for gravado localmente:

    drop table if exists ur_table;
    CREATE TABLE ur_table
    (
        id serial NOT NULL,
        log_id numeric, 
        proc_code numeric,
        date timestamp,
        qty int,
        name varchar,
        price money
    );
    COPY 
        ur_table(id, log_id, proc_code, date, qty, name, price)
    FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;

2. Quando o \ path\xxx. csv está no servidor, o postgreSQL não tem o Permissão para acessar o servidor, você terá que importar o .o arquivo csv através do pgAdmin construído em funcionalidade.

Carregue com o botão direito no nome da tabela escolha Importar.

enter image description here

Se ainda tem problema, por favor consulte este tutorial. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

 6
Author: flowera, 2017-10-09 20:53:59

Utilize este código SQL

    copy table_name(atribute1,attribute2,attribute3...)
    from 'E:\test.csv' delimiter ',' csv header

A palavra-chave do cabeçalho permite ao DBMS saber que o ficheiro csv tem um cabeçalho com atributos

Para mais visitas http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

 5
Author: djdere, 2017-01-18 09:02:59

IMHO, a maneira mais conveniente é seguir "Importar dados CSV para o postgresql, o confortável, forma ;-)", usando csvsql de csvkit, que é um pacote python instalável via pip.

 3
Author: sal, 2018-06-21 13:58:29
  1. Criar uma tabela primeiro

  2. Em seguida, use o comando copy para copiar os detalhes da tabela:

Copy table_name (C1,C2,C3....)
de 'localização do seu ficheiro csv 'delimiter', ' cabeçalho csv;

Obrigado.
 1
Author: user9130085, 2018-04-23 17:57:18

Crie a tabela e tenha as colunas necessárias que são usadas para criar a tabela no ficheiro csv.

  1. Abra os postgres e carregue com o botão direito na tabela de destino que deseja carregar e seleccionar importar e actualizar os seguintes passos na secção opções do ficheiro

  2. Agora navegue o seu ficheiro no nome do ficheiro

  3. Seleccionar csv no formato

  4. Codificação como ISO_ 8859_5

Agora goto Misc. Opções e verificar o cabeçalho e carregar em importar.
 0
Author: suriruler, 2017-07-04 09:00:07

Se precisar de um mecanismo simples para importar do CSV multi-linha text/parse, pode usar:

CREATE TABLE t   -- OR INSERT INTO tab(col_names)
AS
SELECT
   t.f[1] AS col1
  ,t.f[2]::int AS col2
  ,t.f[3]::date AS col3
  ,t.f[4] AS col4
FROM (
  SELECT regexp_split_to_array(l, ',') AS f
  FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;

Demonstração Do DBFiddle

 0
Author: Lukasz Szozda, 2018-04-23 17:55:40