web-dev-qa-db-fra.com

Comment importer des données de fichier CSV dans une table PostgreSQL?

Comment puis-je écrire une procédure stockée qui importe des données à partir d'un fichier CSV et remplit la table?

547
vardhan

Jetez un coup d'oeil à ceci article court .


La solution paraphrasée ici:

Créez votre table:

CREATE TABLE Zip_codes 
(Zip char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, Zip_CLASS varchar);

Copiez les données de votre fichier CSV dans la table:

COPY Zip_codes FROM '/path/to/csv/Zip_CODES.txt' WITH (FORMAT csv);
726
Bozhidar Batsov

Si vous n'êtes pas autorisé à utiliser COPY (qui fonctionne sur le serveur de base de données), vous pouvez utiliser \copy à la place (qui fonctionne dans le client de base de données). En utilisant le même exemple que Bozhidar Batsov:

Créez votre table:

CREATE TABLE Zip_codes 
(Zip char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, Zip_CLASS varchar);

Copiez les données de votre fichier CSV dans la table:

\copy Zip_codes FROM '/path/to/csv/Zip_CODES.txt' DELIMITER ',' CSV

Vous pouvez également spécifier les colonnes à lire:

\copy Zip_codes(Zip,CITY,STATE) FROM '/path/to/csv/Zip_CODES.txt' DELIMITER ',' CSV
177
bjelli

Un moyen rapide de procéder consiste à utiliser la bibliothèque Python pandas (la version 0.15 ou supérieure fonctionne mieux). Cela gérera la création des colonnes pour vous - bien que, de toute évidence, les choix qu’il fait pour les types de données puissent ne pas être ce que vous voulez. Si cela ne vous convient pas, vous pouvez toujours utiliser le code 'create table' généré en tant que modèle.

Voici un exemple simple:

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)

Et voici un code qui vous montre comment définir différentes options:

# Set it 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]
68
RobinL

Vous pouvez également utiliser pgAdmin, qui offre une interface graphique pour effectuer l'importation. Cela est indiqué dans ce SO thread . L'avantage d'utiliser pgAdmin est que cela fonctionne également pour les bases de données distantes.

Un peu comme les solutions précédentes, vous auriez déjà besoin de votre table sur la base de données. Chaque personne a sa propre solution, mais ce que je fais habituellement, c’est d’ouvrir le fichier CSV dans Excel, de copier les en-têtes, de coller avec une transposition spéciale sur une feuille de calcul différente, de placer le type de données correspondant dans la colonne suivante, puis de le copier-coller dans un éditeur de texte. avec la requête de création de table SQL appropriée comme ceci:

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)
28
Paul

Comme Paul l'a mentionné, l'import fonctionne dans pgAdmin:

clic droit sur le tableau -> importer

sélectionner le fichier local, le format et le codage

voici une capture d'écran allemande de l'interface graphique pgAdmin:

pgAdmin import GUI

chose similaire que vous pouvez faire avec DbVisualizer (j'ai une licence, je ne suis pas sûr de la version gratuite)

clic droit sur une table -> Importer les données de la table ...

DbVisualizer import GUI

20
Andreas L.

La plupart des autres solutions ici nécessitent que vous créiez la table à l'avance/manuellement. Cela peut ne pas être pratique dans certains cas (par exemple, si vous avez beaucoup de colonnes dans la table de destination). Ainsi, l'approche ci-dessous peut être utile.

En fournissant le chemin et le nombre de colonnes de votre fichier csv, vous pouvez utiliser la fonction suivante pour charger votre table dans une table temporaire nommée target_table:

La ligne du haut est supposée avoir les noms de colonne.

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
    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;
19
mehmet
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
16
Timothy Siwula
  1. créer d'abord une table

  2. Ensuite, utilisez la commande copy pour copier les détails de la table:

copie nom_table (C1, C2, C3 ....)
from 'chemin vers votre fichier csv' délimiteur ',' en-tête csv;

Merci

9
user9130085

Expérience personnelle avec PostgreSQL, attendant toujours un moyen plus rapide.

1. Créez d'abord le squelette de la table si le fichier est stocké localement:

    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. Lorsque le répertoire\path\xxx.csv est sur le serveur, PostgreSQL n'a pas l'autorisation d'accès au serveur, vous devez donc importer le fichier .csv via la fonctionnalité intégrée de pgAdmin.

Faites un clic droit sur le nom de la table et choisissez importer.

enter image description here

Si vous avez toujours un problème, veuillez vous référer à ce tutoriel. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

7
flowera

Utilisez ce code SQL

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

le mot-clé header permet au SGBD de savoir que le fichier csv a un en-tête avec attributs

pour plus de visite http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

6
djdere

IMHO, le moyen le plus pratique est de suivre " Importer des données CSV dans postgresql, la manière la plus confortable; -) ", en utilisant csvsql de csvkit , qui est un package python pouvant être installé via pip.

5
sal

En Python, vous pouvez utiliser ce code pour la création automatique de tables PostgreSQL avec les noms de colonnes:

import pandas, csv

from io import StringIO
from sqlalchemy import create_engine

def psql_insert_copy(table, conn, keys, data_iter):
    dbapi_conn = conn.connection
    with dbapi_conn.cursor() as cur:
        s_buf = StringIO()
        writer = csv.writer(s_buf)
        writer.writerows(data_iter)
        s_buf.seek(0)
        columns = ', '.join('"{}"'.format(k) for k in keys)
        if table.schema:
            table_name = '{}.{}'.format(table.schema, table.name)
        else:
            table_name = table.name
        sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
        cur.copy_expert(sql=sql, file=s_buf)

engine = create_engine('postgresql://user:password@localhost:5432/my_db')

df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)

C'est aussi relativement rapide, je peux importer plus de 3,3 millions de lignes en environ 4 minutes.

1
Marc

Comment importer des données de fichier CSV dans une table PostgreSQL?

pas:

  1. Besoin de connecter la base de données postgresql dans un terminal

    psql -U postgres -h localhost
    
  2. Besoin de créer une base de données

    create database mydb;
    
  3. Besoin de créer un utilisateur

    create user siva with password 'mypass';
    
  4. Se connecter avec la base de données

    \c mydb;
    
  5. Besoin de créer un schéma

    create schema trip;
    
  6. Besoin de créer une table

    create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
    );
    
  7. Importer les données du fichier csv dans postgresql

    COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
    
  8. Trouver les données de la table donnée

    select * from trip.test;
    
1
sivamani

Créez une table et indiquez les colonnes requises pour créer une table dans un fichier csv.

  1. Ouvrez postgres et cliquez avec le bouton droit sur la table cible que vous souhaitez charger. Sélectionnez Importer et mettez à jour les étapes suivantes dans options de fichier section

  2. Maintenant, parcourez votre fichier en nom de fichier

  3. Sélectionnez csv au format

  4. Encodage ISO_8859_5

Maintenant, allez à options diverses, vérifiez l'en-tête et cliquez sur importer.

0
suriruler

Si vous avez besoin d'un mécanisme simple pour importer du CSV multiligne text/parse, vous pouvez utiliser:

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;

Démo DBFiddle

0
Lukasz Szozda

J'ai créé un petit outil qui importe le fichier csv dans PostgreSQL super easy, juste une commande. Il créera et remplira les tables. Malheureusement, pour le moment, tous les champs créés automatiquement utilisent le type TEXT.

csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase

L'outil peut être trouvé sur https://github.com/eduardonunesp/csv2pg

0
Eduardo Pereira