Come posso scrivere una procedura memorizzata che importa i dati da un file CSV e popola la tabella?
Come posso scrivere una procedura memorizzata che importa i dati da un file CSV e popola la tabella?
Risposte:
Dai un'occhiata a questo breve articolo .
Soluzione parafrasata qui:
Crea il tuo tavolo:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Copia i dati dal tuo file CSV nella tabella:
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER;
postgresql.org/docs/9.1/static/sql-copy.html
Se non si dispone dell'autorizzazione per l'uso COPY
(che funziona sul server db), è possibile utilizzare \copy
invece (che funziona nel client db). Utilizzando lo stesso esempio di Bozhidar Batsov:
Crea il tuo tavolo:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Copia i dati dal tuo file CSV nella tabella:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Puoi anche specificare le colonne da leggere:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Vedi la documentazione per COPIA :
Non confondere COPIA con l'istruzione psql \ copia. \ copy richiama COPY DA STDIN o COPY TO STDOUT, quindi recupera / archivia i dati in un file accessibile al client psql. Pertanto, l'accessibilità dei file e i diritti di accesso dipendono dal client anziché dal server quando viene utilizzato \ copy.
e nota:
Per le colonne di identità, il comando COPIA DA scriverà sempre i valori di colonna forniti nei dati di input, come l'opzione INSERT OVERRIDING SYSTEM VALUE.
COPY
ed \copy
è molto più di un semplice permesso, e non puoi semplicemente aggiungere un `` per farlo funzionare magicamente. Vedere la descrizione (nel contesto di esportazione) qui: stackoverflow.com/a/1517692/157957
Un modo rapido per farlo è con la libreria panda Python (la versione 0.15 o successiva funziona meglio). Questo gestirà la creazione delle colonne per te, anche se ovviamente le scelte che fa per i tipi di dati potrebbero non essere ciò che desideri. Se non fa esattamente ciò che desideri, puoi sempre utilizzare il codice "crea tabella" generato come modello.
Ecco un semplice esempio:
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)
Ed ecco un po 'di codice che mostra come impostare varie opzioni:
# 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]
if_exists
parametro può essere impostato per sostituire o aggiungere a una tabella esistente, ad es.df.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
è molto lento, è possibile utilizzare d6tstack.utils.pd_to_psql()
da d6tstack vedere il confronto delle prestazioni
È inoltre possibile utilizzare pgAdmin, che offre una GUI per eseguire l'importazione. Questo è mostrato in questo thread SO . Il vantaggio dell'utilizzo di pgAdmin è che funziona anche per database remoti.
Proprio come le soluzioni precedenti, tuttavia, è necessario disporre già della tabella nel database. Ogni persona ha la sua soluzione, ma quello che faccio di solito è aprire il CSV in Excel, copiare le intestazioni, incollare speciali con trasposizione su un foglio di lavoro diverso, posizionare il tipo di dati corrispondente nella colonna successiva, quindi semplicemente copiarlo e incollarlo in un editor di testo insieme alla query di creazione della tabella SQL appropriata in questo modo:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
La maggior parte delle altre soluzioni qui richiede di creare la tabella in anticipo / manualmente. Questo potrebbe non essere pratico in alcuni casi (ad esempio, se nella tabella di destinazione sono presenti molte colonne). Quindi, l'approccio che segue potrebbe tornare utile.
Fornendo il percorso e il conteggio delle colonne del file CSV, è possibile utilizzare la seguente funzione per caricare la tabella in una tabella temporanea che verrà denominata come target_table
:
Si presume che la riga superiore abbia i nomi delle 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;
public
)
Come menzionato da Paolo, l'importazione funziona in pgAdmin:
tasto destro del mouse sulla tabella -> importa
seleziona file locale, formato e codifica
ecco uno screenshot tedesco della GUI di pgAdmin:
cosa simile che puoi fare con DbVisualizer (ho una licenza, non sono sicuro della versione gratuita)
fare clic con il tasto destro su una tabella -> Importa dati tabella ...
crea prima una tabella
Quindi utilizzare il comando copia per copiare i dettagli della tabella:
copia table_name (C1, C2, C3 ....)
da 'percorso al tuo file csv' delimitatore ',' intestazione csv;
Grazie
Usa questo codice SQL
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
la parola chiave header indica al DBMS che il file CSV ha un'intestazione con attributi
per ulteriori informazioni, visitare http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Esperienza personale con PostgreSQL, ancora in attesa di un modo più veloce.
1. Creare prima lo scheletro della tabella se il file è archiviato 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 \ path \ xxx.csv è sul server, postgreSQL non ha i permessi per accedere al server, dovrai importare il file .csv attraverso la funzionalità integrata di pgAdmin.
Fare clic con il tasto destro del mouse sul nome della tabella e selezionare Importa.
Se il problema persiste, consulta questo tutorial. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Come importare i dati dei file CSV in una tabella PostgreSQL?
passaggi:
È necessario collegare il database postgresql nel terminale
psql -U postgres -h localhost
È necessario creare un database
create database mydb;
È necessario creare l'utente
create user siva with password 'mypass';
Connettiti con il database
\c mydb;
È necessario creare uno schema
create schema trip;
È necessario creare una tabella
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
);
Importa i dati del file CSV 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;
Trova i dati della tabella dati
select * from trip.test;
IMHO, il modo più conveniente è seguire " Importa dati CSV in postgresql, il modo più comodo ;-) ", usando csvsql di csvkit , che è un pacchetto Python installabile tramite pip.
In Python, puoi usare questo codice per la creazione automatica di tabelle PostgreSQL con nomi di colonne:
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)
È anche relativamente veloce, posso importare più di 3,3 milioni di righe in circa 4 minuti.
Se hai bisogno di un meccanismo semplice per importare da CSV multilinea text / parse puoi usare:
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;
DBeaver Community Edition (dbeaver.io) semplifica la connessione a un database, quindi importa un file CSV per il caricamento su un database PostgreSQL. Inoltre, semplifica l'emissione di query, il recupero di dati e il download di set di risultati in formato CSV, JSON, SQL o altri formati di dati comuni.
È uno strumento di database multipiattaforma FOSS per programmatori, DBA e analisti SQL che supporta tutti i database più diffusi: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, ecc. È un concorrente FOSS valido per TOAD per Postgres, TOAD per SQL Server o Toad per Oracle.
Non ho alcuna affiliazione con DBeaver. Adoro il prezzo (GRATUITO!) E la piena funzionalità, ma vorrei che aprissero di più questa applicazione DBeaver / Eclipse e rendessero più semplice l'aggiunta di widget di analisi a DBeaver / Eclipse, piuttosto che richiedere agli utenti di pagare l'abbonamento annuale di $ 199 solo per creare grafici e diagrammi direttamente all'interno dell'applicazione. Le mie capacità di programmazione Java sono arrugginite e non ho voglia di settimane per imparare di nuovo a costruire widget di Eclipse, (solo per scoprire che DBeaver ha probabilmente disabilitato la possibilità di aggiungere widget di terze parti a DBeaver Community Edition.)
Gli utenti esperti di DBeaver che sono sviluppatori Java possono fornire informazioni dettagliate sui passaggi per creare widget di analisi da aggiungere alla Community Edition di DBeaver?
Creare una tabella e disporre delle colonne necessarie per la creazione della tabella nel file CSV.
Apri Postgres e fai clic con il pulsante destro del mouse sulla tabella di destinazione che desideri caricare e seleziona Importa e aggiorna i seguenti passaggi nella sezione Opzioni file
Ora sfoglia il tuo file nel nome del file
Seleziona CSV nel formato
Codifica come ISO_8859_5
Ora vai a Misc. opzioni e controllare l'intestazione e fare clic su import.
Ho creato un piccolo strumento che importa csv
file in PostgreSQL super facile, solo un comando e creerà e popolerà le tabelle, sfortunatamente, al momento tutti i campi creati automaticamente usano il tipo TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
Lo strumento è disponibile su https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Immagino che la parte in cui viene creata la tabella sia piacevole, ma poiché ogni campo è di testo non è super utile