Postgresql पर शीर्षकों के साथ CSV के रूप में तालिका कैसे निर्यात करें?


418

मैं एक PostgreSQL तालिका को कमांड लाइन के माध्यम से एक CSV फ़ाइल के शीर्षकों के साथ निर्यात करने का प्रयास कर रहा हूं, हालांकि मुझे यह CSV फ़ाइल को निर्यात करने के लिए मिलता है, लेकिन शीर्षकों के बिना।

मेरा कोड निम्नानुसार दिखता है:

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

क्या आप पोस्टग्रेज> = 8.1 का उपयोग कर रहे हैं?
द साने

1
मुझे लगता है कि मैं नए संस्करण में
अपग्रेड

1
इन्हें भी देखें stackoverflow.com/q/1517635/287948
पीटर क्रूस

जवाबों:


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

जैसा कि मैनुअल में वर्णित है ।


7
ज्ञात हो कि HEADER तर्क 8.1 तक पेश नहीं किया गया था।
द साने

7
जो है, कहने दो, थोड़ा जंग खाओ।
मिलन ए। राडदेव

65
नोट के COPYलिए व्यवस्थापक विशेषाधिकारों की आवश्यकता है। का प्रयोग करें \COPYबजाय यदि आप समस्या आती है।
fny

5
यह आपको गैर-अनुरूपक आउटपुट दे सकता है, "DELIMITER '," "की तुलना में" FORMAT csv "का उपयोग करने के लिए बेहतर है। यकीन है कि क्या संस्करण है कि हालांकि में नहीं आया
grahamrhay

37
V9.5 के लिए, अब कमांड हैCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
शुभम गोयल

223

Psll कमांड लाइन से:

\COPY my_table TO 'filename' CSV HEADER

अंत में कोई अर्ध-उपनिवेश नहीं।


22
यह संस्करण अब तक का सबसे अच्छा है क्योंकि COPYकमांड को एडमिन एक्सेस की आवश्यकता है
मैथ्यू ओ'रियोर्डन

2
psqlएप्रोच के साथ , आउटपुट को कहीं भी सहेज सकता है, जहां तक ​​किसी की पहुंच हो। मैंने सिर्फ psqlदूरस्थ सर्वर से स्थानीय फ़ाइल में डेटा प्राप्त करने के लिए दृष्टिकोण का उपयोग किया । बहुत चालाक है।
इयान गो जूल

बहुत बेहतर है, खासकर जब एक निर्देशिका को सहेजते हुए जहां आपकी पहुंच होती है, लेकिन उपयोगकर्ता को पोस्टग्रेज नहीं करता है।
स्टीव बेनेट

2
@ हरिलवन उपयोग pg_dump -h remote | pg_restore -h localhost
इयान गो

4
@ हरिलवनpsql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
जूहा

122

केवल तालिका नाम के बजाय, आप केवल चयनित स्तंभ डेटा प्राप्त करने के लिए एक क्वेरी लिख सकते हैं।

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

व्यवस्थापक विशेषाधिकार के साथ

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

मुझे विश्वास नहीं है कि आपको कमांड के psll संस्करण में समाप्ति अर्धविराम की आवश्यकता है ( \COPY ...)। और कम से कम मेरे psql के संस्करण (9.5.2) में मुझे 'DELIMITER' को निर्दिष्ट करने की आवश्यकता नहीं थी; डिफ़ॉल्ट अल्पविराम था।
user1071847

अगर मैं चयनित फ़ील्ड के लिए CSV से टेबल पर कॉपी कर रहा हूँ तो सिंटैक्स कैसे बदलता है
user269867

99

जब मुझे पोस्टग्रेज से फाइल लिखने की अनुमति नहीं है तो मुझे लगता है कि मैं कमांड लाइन से क्वेरी को चला सकता हूं।

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

7
"किसी भी वातावरण" के लिए सबसे अच्छा है। के लिए सर्वश्रेष्ठ 1. Postgresql पर या ग्राहक पर विशेष अनुमति की आवश्यकता नहीं है; 2. सापेक्ष पथ का उपयोग कर सकते हैं; और 3. वास्तविक सीएसवी प्रारूप (सुरक्षित कोटेशन) के लिए सुरक्षित है।
पीटर क्रूस

34

यह काम

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

10
अच्छा लगा। ध्यान दें कि यह उन क्षेत्रों के अंदर अल्पविराम से बचने के लिए नहीं है जो उन्हें शामिल करते हैं।
पुनरावर्ती काल

मुझे यह पसंद है, बिना -F ,, और |विभाजक के रूप में उपयोग करें । धन्यवाद!
dsummersl

2
यह वह नहीं है जिसे आमतौर पर एक निर्यात सुविधा के रूप में माना जाता है, बस नियंत्रित डेटा प्रदर्शन। यह अंतर हल्का है, लेकिन महत्वपूर्ण है: यह एक मानव द्वारा उस COPYकथन की तुलना में पढ़ा जाना है जो पुन: उपयोग की जाने वाली फाइल बनाता है
रोमेन जी

7
खतरा यह सीएसवी प्रारूप के लिए नहीं है "," सरणियों या के साथ पाठ के लिए नहीं काम करता है, .. उचित सीएसवी-उद्धरण भी नहीं। @ ब्रायन के उत्तर का उपयोग करें।
पीटर क्रैस

8

संस्करण 9.5 के लिए मैं उपयोग करता हूं, यह इस तरह होगा:

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

7

इस समाधान ने मेरे लिए काम किया \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

ध्वज psqlका उपयोग करके सबसे सरल तरीका (उपयोग करना ) प्रतीत होता है --csv:

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

यह केवल PostgreSQL के संस्करण 12+
डिर्क

3

Heres कैसे मैं इसे एक पास्कल पीजी डेटाबेस के लिए pgsl connect का उपयोग कर पावर शेल काम कर रहा है:

मुझे पहले क्लाइंट एन्कोडिंग को इस तरह utf8 में बदलना था: \encoding UTF8

फिर डेटा को CSV फ़ाइल में डंप कर दिया:

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

मैंने ~ का उपयोग परिसीमनक के रूप में किया है क्योंकि मुझे CSV फ़ाइलें पसंद नहीं हैं, मैं आमतौर पर TSV फ़ाइलों का उपयोग करता हूं, लेकिन यह मुझे 't' को सीमांकक के रूप में जोड़ने की अनुमति नहीं देगा, इसलिए मैंने ~ का उपयोग किया क्योंकि इसकी शायद ही कभी इस्तेमाल की गई क्रैकर है।


0

copy (anysql query datawanttoexport) को 'fileablsoutepathwihname' delimiter ',' csv हैडर;

इस यू का उपयोग करके डेटा भी निर्यात कर सकते हैं।


0

मैं इस उत्तर को पोस्ट कर रहा हूं क्योंकि यहां दिए गए अन्य उत्तरों में से कोई भी वास्तव में मेरे लिए काम नहीं करता है। मैं उपयोग नहीं कर सकाCOPY पोस्टग्रेज के भीतर से था, क्योंकि मेरे पास सही अनुमति नहीं थी। इसलिए मैंने "निर्यात ग्रिड पंक्तियों" को चुना और आउटपुट को UTF-8 के रूप में सहेजा।

psqlसंस्करण @Brian द्वारा दिए गए भी मेरे लिए काम नहीं किया, एक अलग कारण के लिए। यह काम नहीं करने का कारण यह है कि जाहिरा तौर पर विंडोज कमांड प्रॉम्प्ट (मैं विंडोज का उपयोग कर रहा था) अपने आप एन्कोडिंग के साथ चारों ओर चक्कर लगा रहा था। मुझे यह त्रुटि मिलती रही:

त्रुटि: बाइट अनुक्रम 0x81 के साथ एन्कोडिंग "WIN1252" में वर्ण "UTF8" को एन्कोडिंग में समतुल्य नहीं है

मैंने जिस समाधान का उपयोग किया था, वह एक छोटी JDBC स्क्रिप्ट (Java) को लिखने के लिए था, जो CSV फ़ाइल को पढ़ता था और सीधे मेरे पोस्टग्रेज टेबल में सम्मिलित विवरण जारी करता था। यह काम किया है, लेकिन कमांड प्रॉम्प्ट ने भी काम किया होगा, यह एन्कोडिंग को बदल नहीं रहा था।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.