Question 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?


477
2018-06-07 06:19


origine


Réponses:


Regarde ça article court.


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);

667
2018-06-07 06:24



Si vous n'êtes pas autorisé à utiliser COPY (qui fonctionnent 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

144
2018-06-20 07:26



Un moyen rapide de le faire est d'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 - même si, évidemment, les choix qu'il fait pour les types de données ne sont peut-être pas ceux que vous souhaitez. Si ce n'est pas tout à fait ce que vous voulez, vous pouvez toujours utiliser le code "Créer une 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 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]

57
2018-04-18 20:22



Vous pouvez également utiliser pgAdmin, qui offre une interface graphique pour effectuer l'importation. C'est montré dans cette Fil SO. L'avantage d'utiliser pgAdmin est qu'il fonctionne également pour les bases de données distantes.

Tout comme les solutions précédentes, vous auriez déjà besoin de votre table dans la base de données. Chaque personne a sa propre solution mais ce que je fais habituellement est d'ouvrir le fichier CSV dans Excel, de copier les en-têtes, de coller avec une transposition sur une autre feuille de calcul, de placer le type de données dans la colonne suivante. avec la requête de création de table SQL appropriée comme suit:

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

27
2017-11-03 19:49



Comme Paul l'a mentionné, importez les travaux dans pgAdmin:

clic droit sur la table -> import

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

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

pgAdmin import GUI

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

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

DbVisualizer import GUI


18
2017-09-17 08:55



La plupart des autres solutions nécessitent ici 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
    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;

16
2018-05-06 17:24



COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;

13
2017-11-16 19:06



Expérience personnelle avec PostgreSQL, toujours en attente d'un moyen plus rapide.

1. Créez d'abord un squelette de 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 \ path \ xxx.csv est sur le serveur, postgreSQL n'a pas le l'autorisation d'accéder au serveur, vous devrez importer le fichier .csv via la fonctionnalité intégrée pgAdmin.

Cliquez avec le bouton droit sur le nom de la table, 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/


6
2017-07-26 17:06



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 possède un en-tête avec des attributs

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


4
2018-01-12 07:27



À mon humble avis, le moyen le plus pratique est de suivre "Importer des données CSV dans postgresql, le moyen confortable ;-)", en utilisant csvsql de csvkit, qui est un paquet Python installable via pip.


4
2017-11-07 09:54



  1. créer une table en premier

  2. Utilisez ensuite la commande copy pour copier les détails de la table:

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

Merci


1
2017-12-22 07:33