it-swarm.com.de

Wie importiere ich CSV-Dateidaten in eine PostgreSQL-Tabelle?

Wie kann ich eine gespeicherte Prozedur schreiben, die Daten aus einer CSV-Datei importiert und die Tabelle auffüllt?

547
vardhan

Schauen Sie sich das an kurzer Artikel .


Hier umschriebene Lösung:

Erstellen Sie Ihre Tabelle:

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

Kopieren Sie Daten aus Ihrer CSV-Datei in die Tabelle:

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

Wenn Sie nicht berechtigt sind, COPY (das auf dem Datenbankserver funktioniert) zu verwenden, können Sie stattdessen \copy (das im Datenbankclient funktioniert) verwenden. Verwenden Sie dasselbe Beispiel wie Bozhidar Batsov:

Erstellen Sie Ihre Tabelle:

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

Daten aus Ihrer CSV-Datei in die Tabelle kopieren:

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

Sie können auch die zu lesenden Spalten angeben:

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

Eine schnelle Möglichkeit hierfür ist die Bibliothek Python pandas (Version 0.15 oder höher funktioniert am besten). Auf diese Weise können Sie die Spalten für Sie erstellen - obwohl die Auswahl, die für die Datentypen getroffen wird, möglicherweise nicht Ihren Wünschen entspricht. Wenn es nicht genau das tut, was Sie wollen, können Sie immer den Code zum Erstellen einer Tabelle verwenden, der als Vorlage generiert wurde.

Hier ist ein einfaches Beispiel:

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:[email protected]:5432/dbname')

df.to_sql("my_table_name", engine)

Und hier ist ein Code, der Ihnen zeigt, wie Sie verschiedene Optionen einstellen:

# 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

Sie können auch pgAdmin verwenden, das eine grafische Benutzeroberfläche für den Import bietet. Das wird in diesem SO-Thread gezeigt. Der Vorteil von pgAdmin ist, dass es auch für entfernte Datenbanken funktioniert.

Ähnlich wie bei den vorherigen Lösungen müssten Sie Ihre Tabelle bereits in der Datenbank haben. Jede Person hat ihre eigene Lösung, aber normalerweise öffne ich die CSV in Excel, kopiere die Überschriften, füge Spezial mit Transposition in ein anderes Arbeitsblatt ein, füge den entsprechenden Datentyp in die nächste Spalte ein und kopiere ihn dann in einen Texteditor zusammen mit der entsprechenden SQL-Tabellenerstellungsabfrage wie folgt:

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

Wie Paul erwähnte, funktioniert der Import in pgAdmin:

rechtsklick auf Tabelle -> Importieren

wählen Sie die lokale Datei, das Format und die Codierung aus

hier ist ein deutscher pgAdmin GUI Screenshot:

pgAdmin import GUI

ähnliches kannst du mit DbVisualizer machen (ich habe eine Lizenz, bin mir nicht sicher, ob ich eine kostenlose Version haben soll)

rechtsklick auf eine Tabelle -> Tabellendaten importieren ...

DbVisualizer import GUI

20
Andreas L.

Die meisten anderen Lösungen setzen voraus, dass Sie die Tabelle im Voraus manuell erstellen. Dies ist in einigen Fällen möglicherweise nicht praktikabel (z. B. wenn die Zieltabelle viele Spalten enthält). So kann der Ansatz unten nützlich sein.

Wenn Sie den Pfad und die Spaltenanzahl Ihrer CSV-Datei angeben, können Sie Ihre Tabelle mit der folgenden Funktion in eine temporäre Tabelle mit dem Namen target_table laden:

Es wird angenommen, dass die oberste Zeile die Spaltennamen enthält.

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. erst eine tabelle erstellen

  2. Verwenden Sie dann den Befehl copy, um die Tabellendetails zu kopieren:

Kopie Tabellenname (C1, C2, C3 ....)
from 'Pfad zu Ihrer CSV-Datei' Delimiter ',' CSV-Header;

Vielen Dank

9
user9130085

Persönliche Erfahrung mit PostgreSQL, die immer noch auf einen schnelleren Weg wartet.

1. Erstellen Sie zuerst ein Tabellenskelett, wenn die Datei lokal gespeichert ist:

    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. Wenn sich\path\xxx.csv auf dem Server befindet, hat postgreSQL nicht die Berechtigung, auf den Server zuzugreifen. Sie müssen die CSV-Datei über die in pgAdmin integrierte Funktionalität importieren.

Klicken Sie mit der rechten Maustaste auf den Tabellennamen und wählen Sie "Importieren".

enter image description here

Wenn Sie immer noch Probleme haben, lesen Sie bitte dieses Tutorial. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

7
flowera

Verwenden Sie diesen SQL-Code

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

das Schlüsselwort header informiert das DBMS darüber, dass die CSV-Datei einen Header mit Attributen enthält

weitere Informationen finden Sie unter http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

6
djdere

IMHO ist der bequemste Weg zu folgen " Importieren von CSV-Daten in postgresql, der bequeme Weg; -) ", mit csvsql von csvkit , Dies ist ein python -Paket, das über pip installiert werden kann.

5
sal

In Python können Sie diesen Code für die automatische Erstellung von PostgreSQL-Tabellen mit Spaltennamen verwenden:

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:[email protected]:5432/my_db')

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

Es ist auch relativ schnell, ich kann mehr als 3,3 Millionen Zeilen in ca. 4 Minuten importieren.

1
Marc

Wie importiere ich CSV-Dateidaten in eine PostgreSQL-Tabelle?

schritte:

  1. Müssen Postgresql-Datenbank im Terminal verbinden

    psql -U postgres -h localhost
    
  2. Datenbank erstellen müssen

    create database mydb;
    
  3. Müssen Benutzer erstellen

    create user siva with password 'mypass';
    
  4. Mit Datenbank verbinden

    \c mydb;
    
  5. Müssen Schema erstellen

    create schema trip;
    
  6. Müssen Tabelle erstellen

    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. Importieren Sie die CSV-Daten in 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. Finden Sie die angegebenen Tabellendaten

    select * from trip.test;
    
1
sivamani

Erstellen Sie eine Tabelle und benötigen Sie Spalten, die zum Erstellen einer Tabelle in einer CSV-Datei verwendet werden.

  1. Öffnen Sie postgres und klicken Sie mit der rechten Maustaste auf die Zieltabelle, die Sie laden möchten. Wählen Sie importieren und aktualisieren Sie die folgenden Schritte im Abschnitt Dateioptionen

  2. Durchsuchen Sie jetzt Ihre Datei in Dateiname

  3. Wählen Sie CSV im Format

  4. Codierung als ISO_8859_5

Nun gehe zu Verschiedene Optionen und überprüfe den Header und klicke auf Importieren.

0
suriruler

Wenn Sie einen einfachen Mechanismus zum Importieren von mehrzeiliger Text-/Analyse-CSV benötigen, können Sie Folgendes verwenden:

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;

DBFiddle Demo

0
Lukasz Szozda

Ich habe ein kleines Tool erstellt, das die csv -Datei sehr einfach in PostgreSQL importiert. Es ist nur ein Befehl und erstellt und füllt die Tabellen. Leider werden derzeit alle automatisch erstellten Felder vom Typ TEXT

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

Das Tool finden Sie unter https://github.com/eduardonunesp/csv2pg

0
Eduardo Pereira