Postgresql'de başlıklarla CSV olarak tablo nasıl dışa aktarılır?


418

Komut satırı üzerinden bir CSV dosyasına başlıkları olan bir PostgreSQL tablo vermeye çalışıyorum, ancak CSV dosyasına vermek için ancak başlıkları olmadan olsun.

Kodum aşağıdaki gibi görünüyor:

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

Postgres> = 8.1 mi kullanıyorsunuz?
Dana the Sane

1
Yeni sürüme geçmek için bir plan yapacağımı düşünüyorum, hayatı çok daha kolaylaştıracak
Elitmiar

Yanıtlar:


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

kılavuzda açıklandığı gibi .


7
HEADER argümanının 8.1'e kadar getirilmediğini unutmayın.
Dana the Sane

7
Diyelim ki biraz paslı.
Milen A. Radev

65
Not COPY, yönetici ayrıcalıkları gerektirir. \COPYSorunlarla karşılaşırsanız bunun yerine kullanın .
fny

5
bu size uyumsuz çıktı verebilir, "FORMAT csv" yi "DELIMITER", "" 'den daha iyi verebilir. emin değil hangi sürüm geldi
grahamrhay

37
V9.5 için, komut şimdiCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal

223

Psql komut satırından:

\COPY my_table TO 'filename' CSV HEADER

sonunda noktalı virgül yok.


22
COPYkomut yönetici erişimi gerektirdiğinden bu sürüm çok iyi
Matthew O'Riordan

2
Ayrıca psqlyaklaşımla, çıktı erişimi olan her yerde kaydedilebilir. Bu psqlyaklaşımı, uzak bir sunucudan yerel bir dosyaya veri almak için kullandım . Çok kaygan.
Ian Gow

Özellikle erişiminiz olan ancak postgres kullanıcısı olmayan bir dizine kaydederken çok daha iyi.
Steve Bennett

2
@arilwan Kullanın 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

yalnızca tablo adı yerine, yalnızca seçili sütun verilerini almak için bir sorgu da yazabilirsiniz.

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

yönetici ayrıcalığı ile

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

Komutun psql sürümünde sonlandırma noktalı virgülüne ihtiyacınız olduğuna inanmıyorum \COPY .... Ve en azından psql (9.5.2) versiyonumda 'DELIMITER' belirtmem gerekmedi; varsayılan bir virgüldü.
user1071847


99

Postgres'ten bir dosya yazma iznim olmadığında, sorguyu komut satırından çalıştırabileceğimi fark ettim.

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

7
"Herhangi bir ortam" için en iyisi. En iyisi 1. Postgresql veya istemcide özel izinlere gerek yoktur; 2. göreli yolu kullanabilir; ve 3. gerçek CSV formatı için güvenli (güvenli teklifler).
Peter Krauss

34

Bu çalışıyor

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

10
Güzel. Bunun, bunları içeren alanların içindeki virgüllerden kaçmadığını unutmayın.
RecursivelyIronic

Bunu seviyorum ve ayırıcı olarak -F ,kullanıyorum |. Teşekkürler!
dsummersl

2
Dışa aktarma özelliği olarak kabul edilen bu değildir, sadece kontrollü veri ekranıdır. Fark hafif, ama önemli: bu, bir insan tarafından COPYyeniden kullanılmak üzere bir dosya oluşturan ifadeden daha çok okunmak üzere tasarlandı
Romain G

7
TEHLİKE CSV biçimi için değildir, "," ile diziler veya metinler için çalışmaz. @ Brian'ın cevabını kullan.
Peter Krauss

8

9.5 sürümünü kullanıyorum, şöyle olurdu:

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

7

Bu çözüm benim için çalıştı \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

En basit yöntem (kullanarak psql) --csvbayrak kullanmaktır :

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

Bu sadece PostgreSQL sürüm 12+ için geçerlidir
Dirk

3

Heres nasıl bir Heroku PG veritabanına pgsl connnect kullanarak çalışma güç kabuk var:

İlk önce böyle utf8 kodlama istemci değiştirmek zorunda kaldı: \encoding UTF8

Sonra verileri bir CSV dosyasına döktüm:

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

Sınırlayıcı olarak ~ kullandım, çünkü CSV dosyalarını sevmiyorum, genellikle TSV dosyalarını kullanıyorum, ancak sınırlayıcı olarak '\ t' eklememe izin vermiyor, bu yüzden ~ kullandım çünkü nadiren kullanılan bir karakter.


0

kopya (anysql sorgu datawanttoexport) 'fileablsoutepathwihname' sınırlayıcı ',' csv başlığına;

Bu u kullanarak verileri de dışa aktarabilirsiniz.


0

Bu cevabı gönderiyorum çünkü burada verilen diğer cevapların hiçbiri gerçekten işe yaramadı. KullanamadımCOPYPostgres içinden , çünkü doğru izinlere sahip değildim. Bu yüzden "Izgara satırlarını dışa aktar" ı seçtim ve çıktıyı UTF-8 olarak kaydettim.

psql@Brian tarafından verilen sürümü de farklı bir nedenden dolayı, benim için çalışmadı. Çalışmamasının nedeni, görünüşe göre Windows komut isteminin (Windows kullanıyordum) kendi başına kodlama ile uğraşmasıydı. Bu hatayı almaya devam ettim:

HATA: "WIN1252" kodlamasında 0x81 bayt dizisi olan karakterin "UTF8" kodlamasında karşılığı yok

Sonunda kullandığım çözüm, CSV dosyasını okuyan ve doğrudan Postgres tabloma insert deyimleri yayınlayan kısa bir JDBC betiği (Java) yazmaktı. Bu işe yaradı, ancak kod istemini değiştirmeseydi komut istemi de işe yarardı.


0

Bunu deneyin: "COPY products_273 '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER '

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.