2009-07-13 33 views
299

Tôi đang cố gắng xuất một bảng PostgreSQL với các tiêu đề sang tệp CSV qua dòng lệnh, tuy nhiên tôi có thể xuất nó sang tệp CSV nhưng không có tiêu đề. Tôi cũng cần những tiêu đề đó. Mã của tôi trông như sauXuất bảng Postgres sang tệp CSV với tiêu đề

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

Bạn đang sử dụng một postgres> = 8.1? –

+0

PostgreSQL 7.3.4 – Roland

+1

Tôi nghĩ tôi sẽ lên kế hoạch nâng cấp lên phiên bản mới hơn, sẽ làm cho cuộc sống dễ dàng hơn rất nhiều – Roland

Trả lời

441
COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER; 

như mô tả trong manual.

+5

Lưu ý rằng đối số HEADER đã không được giới thiệu cho đến 8.1. –

+2

Đó là, giả sử, một chút gỉ. –

+0

Thx cho phản hồi chạy phiên bản cũ 7 ;-( – Roland

30

này hoạt động

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

Tốt. Lưu ý rằng điều này dường như không thoát khỏi dấu phẩy bên trong các trường chứa chúng. – RecursivelyIronic

+0

Tôi thích điều này, không có '-F,', và sử dụng '|' làm dấu tách. Cảm ơn! – dsummersl

+2

Đây không phải là những gì thường được coi là tính năng Xuất, chỉ hiển thị dữ liệu được kiểm soát. Sự khác biệt là ánh sáng, nhưng quan trọng: điều này có ý định được đọc bởi con người hơn là câu lệnh 'COPY' tạo ra một tệp để sử dụng lại –

155

Từ dòng lệnh psql:

\copy my_table to 'filename' csv header

không dấu chấm phẩy ở cuối.

+15

phiên bản này là tốt nhất vì lệnh 'COPY' yêu cầu quyền truy cập quản trị –

+2

Cũng với cách tiếp cận' psql', người dùng có thể lưu đầu ra ở bất kỳ nơi nào có quyền truy cập. Tôi chỉ sử dụng cách tiếp cận 'psql' để lấy dữ liệu từ một máy chủ từ xa vào một tệp cục bộ. Rất trơn. –

+0

Tốt hơn nhiều, đặc biệt là khi lưu vào thư mục mà bạn có quyền truy cập nhưng người dùng postgres thì không. –

77

thay vì chỉ tên bảng, bạn cũng có thể viết truy vấn để chỉ nhận dữ liệu cột được chọn.

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

với quản trị đặc quyền

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

Tôi không tin bạn cần dấu chấm phẩy chấm dứt trong phiên bản psql của lệnh (' \ COPY. ..'). Và ít nhất là trong phiên bản psql của tôi (9.5.2), tôi không cần phải chỉ định 'DELIMITER'; mặc định là dấu phẩy. – user1071847

+2

trong khi viết nó cho thấy lỗi bị từ chối – aravinth

+0

cách cú pháp thay đổi nếu tôi sao chép từ CSV sang bảng cho các trường đã chọn – user269867

1

bản sao (anysql datawanttoexport truy vấn) để 'fileablsoutepathwihname' delimiter '' tiêu đề csv;

Sử dụng u này cũng có thể xuất dữ liệu.

3

Heres làm thế nào tôi nhận nó làm việc vỏ điện sử dụng connnect pgsl đến một cơ sở dữ liệu Heroku PG:

tôi phải đầu tiên thay đổi bảng mã khách hàng để UTF8 như thế này: \encoding UTF8

Sau đó đổ dữ liệu vào một CSV nộp này:

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

tôi đã sử dụng ~ như delimiter vì tôi không thích file CSV, tôi thường sử dụng các file TSV, nhưng nó sẽ không cho phép tôi thêm '\ t' như delimiter, vì vậy tôi sử dụng ~ bởi vì hiếm khi được sử dụng characeter.

45

Khi tôi không có quyền ghi tệp ra khỏi Postgres, tôi thấy rằng tôi có thể chạy truy vấn từ dòng lệnh.

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

Tốt nhất cho "bất kỳ môi trường nào". Tốt nhất cho ** 1. ** Không cần quyền truy cập đặc biệt tại Postgresql hoặc tại máy khách; ** 2. ** có thể sử dụng đường dẫn tương đối; và ** 3. ** là an toàn cho định dạng CSV thực (các trích dẫn an toàn). –

6

Đối với phiên bản 9.5 tôi sử dụng, nó sẽ là như thế này:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER); 
Các vấn đề liên quan