2011-06-29 10 views

Odpowiedz

72

Jeśli używasz PostgreSQL 8.2 lub nowszy, to wykorzystać do CSV:

psql -c "COPY (<select query>) TO STDOUT WITH CSV" 

a to z TSV, z odpowiednich wartości null:

psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''" 

Formularz CSV będzie prawidłowo zacytować żadnych pól, które zawierają znak cudzysłowu. Zapoznaj się z dokumentacją PostgreSQL dla konkretnej wersji, aby uzyskać więcej informacji i opcji dotyczących KOPIOWANIA.

+5

Uwielbiam Postgres! – dan

+7

To naprawdę sprawia, że ​​te rzeczy są łatwe, prawda? Wyobraźmy sobie odpowiedź niektórych "dużych dostawców baz danych" ... Najpierw zainstaluj pakiet 64 megapikseli, a następnie uruchom to narzędzie eksportowe, które ma najbardziej tajemniczą składnię, jaką można sobie wyobrazić. Uważaj, aby nie usunąć całej bazy danych podczas jej używania.:) –

5

edycja: Korzystanie -F

pomocą przecinków poprzez -F i używać "tryb wyjścia niezestrojone stół" -A:

psql my_database -U myuser -A -F , -c "select * from mytable" 
+2

Daje to problemy, jeśli znak separatora pojawi się w wartościach kolumny. – Red15

+0

-F wymaga -A do pracy, należy pamiętać o – albfan

+0

@ Red15, jak obejść ten problem z 'jeśli twój znak separatora pojawia się w wartościach kolumny' –

3

Można określić separator pól z parametrem wiersza poleceń -F do psql

3

Również możliwe jest polecenie copy który pozwala na określenie nagłówka, ograniczniki i opcje cytując

psql my_database -U my_user -c "copy (select a.id,b.id from my_table_a as a inner join my_table_b as b on b.id = a.id) to STDOUT" 
30

Począwszy od odpowiedzi Bohemian za znalazłem te flagi przydatne:

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv 
  • wyjście aligné mode: -A
  • Użyj przecinka jako ogranicznika pola: -F,
  • Nie czytaj psqlrc: -x
  • Krotki tylko (bez nagłówka/stopki): -t zapytania zawierające SQL
  • pliku: -f plik
  • wyjściowe: -o
+2

To * nie * działa tak, jak można by się spodziewać, jeśli wypisujesz pole tekstowe z przecinkiem. –

3

Aby określić TSV użyć separatora '\ t'

psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv 

Aby określić csv użyć separatora ''

psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv 
Powiązane problemy