2009-04-01 28 views
23

Tôi đang cố gắng xuất kết quả truy vấn bằng định dạng phân tách bằng dấu phẩy bằng cách sử dụng công cụ dòng lệnh mysql. sử dụng mysql của tôi không có quyền truy cập vào sử dụng "INTO OUTFILE" tùy chọn tham chiếu trong câu hỏi này:Làm thế nào để bạn xuất kết quả truy vấn MySQL ở định dạng csv (vào màn hình, không phải tệp)?

How to output MySQL query results in CSV format?

Tôi cũng nhận thức được -H và các tùy chọn định dạng đầu ra -X để trong html và xml tương ứng , nhưng không có cách nào để xuất định dạng csv trực tiếp vào màn hình?

Tôi đã tìm thấy phương pháp này bằng sed - http://tlug.dnho.net/?q=node/209. Nhưng, tôi tò mò muốn tìm một giải pháp mysql thẳng.

Bất kỳ ý tưởng nào?

Trả lời

15

tôi đã kết thúc chỉ lấy phân định tab đầu ra và copy dán nó vào một bảng tính và sau đó xuất khẩu đó để csv. Cũng nhận ra rằng tôi có thể đã sử dụng hàm concat hoặc concat_ws để thực hiện công việc và sẽ làm điều đó vào lần sau.

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

CHỌN CONCAT_WS ('', field1, field2, field3) FROM tên_bảng;

+3

Bạn có thể muốn sử dụng tùy chọn '--silent' để loại bỏ đầu ra dạng bảng. Xem http://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html#option_mysql_silent – Nobu

3

Tôi đã sử dụng MySQL trong nhiều năm và tôi không biết cách nào để sử dụng máy khách dòng lệnh mysql để sản xuất đầu ra CSV, ngoại trừ các giải pháp bạn đã tìm thấy.

Có một vài yêu cầu tính năng trong hồ sơ để hỗ trợ đầu ra CSV:

Các giải pháp khác duy nhất tôi xin đề nghị là để viết một kịch bản trong Perl hoặc PHP, để lấy dữ liệu từ MySQL và xuất nó ở định dạng CSV hoặc bất kỳ định dạng nào khác mà bạn muốn. Đây không phải là một kịch bản khó viết.

+0

Tốt để biết tôi không thiếu một cái gì đó rõ ràng. Cảm ơn! – RyanW

1

Nếu bạn có quyền truy cập vào mysqldump bạn có thể sử dụng một cái gì đó như thế này

mysqldump -u [username] -p -t -T/path/to/directory [database] --fields-enclosed-by=\; --fields-terminated-by=, 
+0

Cảm ơn ý tưởng. Tôi nghĩ điều đó sẽ giải quyết được vấn đề quyền của tôi. Nhưng tôi phải lọc thêm các bản ghi và các trường vì nó sẽ đổ toàn bộ một bảng và tôi chỉ đang cố gắng để có được một tập con nhỏ của bảng. – RyanW

+0

Các phiên bản gần đây của mysqldump lấy tham số -w để cung cấp mệnh đề WHERE cho bảng bán phá giá. – staticsan

+0

Cảm ơn, thì đó sẽ là một giải pháp thay thế tuyệt vời. – RyanW

1

CLI có thể xuất ở định dạng được phân tách bằng tab, gần như đủ tốt (tôi nói từ kinh nghiệm). Sử dụng tùy chọn -B. Vấn đề lớn nhất với tab-delimited là tôi không thể làm cho Excel nhập định dạng đó. Tuy nhiên, OpenOffice làm.

+0

Chính xác, tôi đã sử dụng tùy chọn -B và lấy kết quả đầu ra và dán nó vào Số, dường như chấp nhận nó tốt. – RyanW

+1

Cảm ơn, điều này làm việc tuyệt vời. Sau đó, bạn có thể sử dụng sed để biến nó thành CSV. Đảm bảo nhập Ctrl-V trước tab trong câu lệnh Sed. mysql -B -uroot foo -e 'CHỌN email, quốc gia FROM email_signups' | sed -e 's/ /,/g'> foo.csv –

2

Nếu bạn đã cài đặt Bàn làm việc MySQL, bạn có thể chạy truy vấn, sau đó nhấp vào "xuất" phía trên kết quả. Nó sẽ cung cấp cho bạn tùy chọn lưu dưới dạng .CSV.

0

Nếu bạn đang sử dụng mysql tương tác, bạn có thể đặt máy nhắn tin của bạn để sử dụng sed như thế này:

$ mysql -u <user> p<passwpd> 
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g'' 
mysql> SELECT blah FROM blah WHERE blah = blah 

. 
. 
. 
"blah":"blah" 
"blah":"blah" 
"blah":"blah" 

Nếu bạn không sử dụng xem như là máy nhắn tin đầu ra là như thế này:

"blah":"blah","blah":"blah","blah":"blah" 
4
mysql --raw --skip-column-names -u someuser -psomepass -h somehost -b somedatabase -e "select * from somedatabase.sometable;"| awk -F\\t '{print $1","$2","$3}' 

-F\\t tells awk to use a tab as the delimeter on its input, and we print out the desired columns with commas as delimeters using the "," bit. Replace "," with ":" or "|" or whatever to suit your needs. 

Nếu bạn cần phải trích dẫn một trường ouput, cho phép nói $ 1, in awk của bạn sẽ trông như thế này:

awk -F\\t '{print "\""$1"\","$2","$3}' 
1

sau Change output format for MySQL command line results to CSV

 
mysql --skip-column-names --batch -e 'select * from dump3' t | awk -F'\t' '{ sep=""; for(i = 1; i <= NF; i++) { gsub(/\\t/,"\t",$i); gsub(/\\n/,"\n",$i); gsub(/\\\\/,"\\",$i); gsub(/"/,"\"\"",$i); printf sep"\""$i"\""; sep=","; if(i==NF){printf"\n"}}}' 
+0

Điều đó chắc chắn phức tạp hơn nhiều so với câu trả lời được chấp nhận. Tại sao điều này tốt hơn? – Mike

+0

hi, vì tất cả các giải pháp này truyền bá cùng một sai lầm. Không hoàn thành các quy tắc cơ bản về định dạng CSV: https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules * Các trường có dấu phẩy được nhúng hoặc ký tự ngoặc kép phải được trích dẫn. * Mỗi ký tự ngoặc kép được nhúng phải được thể hiện bằng một cặp ký tự ngoặc kép. * Các trường có ngắt dòng được nhúng phải được trích dẫn Kết quả sẽ chỉ là một kết quả phù hợp khi không có dấu phẩy cũng như ký tự không phải dòng mới trong giá trị. –

+0

Ví dụ: kết quả cho hai cột như vậy không thể đọc được chính xác: mysql> chọn * từ csvdata; | column1 | cột2 | + -------------------------- + --------------------- ------------- + | Siêu xe tải "sang trọng" | Cột thứ hai và một dấu phẩy khác | Trả lời bằng SELECT CONCAT_WS 'mysql SELECT CONCAT_WS (',', column1, column2) từ csvdata; + ------------------------------------------------ ----------- + | Siêu xe tải "sang trọng", cột thứ hai, và một dấu phẩy khác | ' –

1

ống câu trả lời cho tr, như thế này:

mysql <blah blah> -B | tr '\t' ',' 
+0

ah nó bị mất công cụ trong dấu ngoặc nhọn ... tôi có nghĩa là mysql {blah blah} -B ... –

Các vấn đề liên quan