Come esportare la tabella come CSV con intestazioni su Postgresql?


418

Sto cercando di esportare una tabella PostgreSQL con intestazioni in un file CSV tramite riga di comando, tuttavia riesco a esportarlo in un file CSV, ma senza intestazioni.

Il mio codice ha il seguente aspetto:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

Stai usando un postgres> = 8.1?
Dana the Sane,

1
Penso che farò un piano per l'aggiornamento alla versione più recente, renderà la vita molto più semplice
Elitmiar,

Risposte:


595
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

come descritto nel manuale .


7
Tenere presente che l'argomento HEADER non è stato introdotto fino alla 8.1.
Dana the Sane,

7
Il che è, diciamo, un po 'arrugginito.
Milen A. Radev,

65
Nota COPYrichiede privilegi di amministratore. Utilizzare \COPYinvece se si verificano problemi.
fny

5
questo può darti un output non conforme, meglio usare "FORMAT csv" che "DELIMITER ','". non sono sicuro di quale versione sia arrivata però
Grahamrhay,

37
Per la v9.5, il comando è oraCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal,

223

Dalla riga di comando psql:

\COPY my_table TO 'filename' CSV HEADER

nessun punto e virgola alla fine.


22
questa versione è di gran lunga la migliore in quanto il COPYcomando richiede l'accesso come amministratore
Matthew O'Riordan,

2
Anche con l' psqlapproccio, si può salvare l'output ovunque si abbia accesso. Ho appena usato l' psqlapproccio per ottenere dati da un server remoto in un file locale. Molto lucido.
Ian Gow,

Molto meglio, specialmente quando si salva in una directory a cui si ha accesso ma l'utente di postgres no.
Steve Bennett,

2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow,

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki,

122

anziché solo il nome della tabella, puoi anche scrivere una query per ottenere solo i dati di colonna selezionati.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

con privilegio di amministratore

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

Non credo che sia necessario il punto e virgola finale nella versione psql del comando ( \COPY ...). E almeno nella mia versione di psql (9.5.2) non avevo bisogno di specificare 'DELIMITER'; il valore predefinito era una virgola.
user1071847

come cambia la sintassi se sto copiando dal CSV alla tabella per i campi selezionati
user269867

99

Quando non ho il permesso di scrivere un file da Postgres, trovo che posso eseguire la query dalla riga di comando.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
Il meglio per "qualsiasi ambiente". Ideale per 1. Non sono necessarie autorizzazioni speciali su Postgresql o sul client; 2. può usare il percorso relativo; e 3. è sicuro per il vero formato CSV (quotazioni sicure).
Peter Krauss,

34

Questo funziona

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
Bello. Nota che questo non sembra sfuggire alle virgole all'interno dei campi che li contengono.
Ricorsivamente

Mi piace questo, senza il -F ,, e uso |come separatore. Grazie!
dsummersl,

2
Questo non è ciò che viene comunemente considerato una funzione di esportazione, ma solo una visualizzazione controllata dei dati. La differenza è leggera, ma importante: questo è più inteso per essere letto da un essere umano che per l' COPYaffermazione che crea un file da riutilizzare
Romain G,

7
PERICOLO non è per il formato CSV, non funziona per le matrici o il testo con "," .. non eseguire la corretta quotazione CSV. Usa la risposta di Brian.
Peter Krauss,

8

Per la versione 9.5 che uso, sarebbe così:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

7

Questa soluzione ha funzionato per me usando \copy.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

4

Il modo più semplice (usando psql) sembra essere usando --csvflag:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

Funziona solo con PostgreSQL versione 12+
Dirk,

3

Ecco come l'ho fatto funzionare power shell usando pgsl connnect a un database Heroku PG:

Ho dovuto prima cambiare la codifica client in utf8 in questo modo: \encoding UTF8

Quindi scaricato i dati in un file CSV questo:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

Ho usato ~ come delimitatore perché non mi piacciono i file CSV, di solito uso file TSV, ma non mi consente di aggiungere '\ t' come delimitatore, quindi ho usato ~ perché è un carattere usato raramente.


0

copia (anysql query datawanttoexport) in 'fileablsoutepathwihname' delimitatore ',' intestazione csv;

Usando questo puoi anche esportare dati.


0

Sto pubblicando questa risposta perché nessuna delle altre risposte fornite qui ha funzionato per me. Non ho potuto usareCOPY da Postgres, perché non avevo i permessi corretti. Quindi ho scelto "Esporta righe griglia" e ho salvato l'output come UTF-8.

Anche la psqlversione fornita da @Brian non ha funzionato per me, per un motivo diverso. La ragione per cui non ha funzionato è che apparentemente il prompt dei comandi di Windows (stavo usando Windows) si stava intromettendo con la codifica da solo. Ho continuato a ricevere questo errore:

ERRORE: il carattere con sequenza di byte 0x81 nella codifica "WIN1252" non ha equivalenti nella codifica "UTF8"

La soluzione che ho finito per usare era scrivere un breve script JDBC (Java) che leggesse il file CSV ed emettesse istruzioni di inserimento direttamente nella mia tabella Postgres. Funzionava, ma anche il prompt dei comandi avrebbe funzionato se non avesse alterato la codifica.


0

Prova questo: "COPIA products_273 DA '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.