Pertanyaan Bagaimana cara menghasilkan hasil query MySQL dalam format CSV?


Apakah ada cara mudah untuk menjalankan query MySQL dari baris perintah Linux dan menampilkan hasilnya CSV  format?

Inilah yang saya lakukan sekarang:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

Itu menjadi berantakan ketika ada banyak kolom yang perlu dikelilingi oleh tanda kutip, atau jika ada tanda kutip di hasil yang harus diloloskan.


932
2017-12-10 15:59


asal


Jawaban:


Dari http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Menggunakan nama kolom perintah ini tidak akan diekspor.

Juga perhatikan itu /var/lib/mysql-files/orders.csv akan berada di server yang menjalankan MySQL. Pengguna yang proses MySQL sedang berjalan di bawah harus memiliki izin untuk menulis ke direktori yang dipilih, atau perintah akan gagal.

Jika Anda ingin menulis output ke mesin lokal Anda dari server jauh (terutama mesin yang di-host atau virtualisasi seperti Heroku atau Amazon RDS), solusi ini tidak cocok.


1425
2017-12-10 16:07



$ mysql your_database --password=foo < my_requests.sql > out.csv

Yang dipisahkan tab. Pipa seperti itu untuk mendapatkan CSV yang sebenarnya (terima kasih @therefromhere):

... .sql | sed 's/\t/,/g' > out.csv

359
2018-04-08 16:53



mysql --batch, -B

Hasil cetak menggunakan tab sebagai pemisah kolom, dengan setiap baris pada a   garis baru. Dengan opsi ini, mysql tidak menggunakan file riwayat.   Mode batch menghasilkan format output non-tabel dan keluar dari   karakter spesial. Escaping dapat dinonaktifkan dengan menggunakan mode mentah; Lihat   deskripsi untuk opsi --raw.

Ini akan memberi Anda file yang dipisahkan tab. Karena koma (atau string yang mengandung koma) tidak lolos maka tidak mudah untuk mengubah pembatas menjadi koma.


170
2017-09-30 10:51



Ini cara yang lumayan girang untuk melakukannya. Menemukannya di suatu tempat, tidak dapat mengambil kredit apa pun

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

Bekerja dengan baik. Sekali lagi meskipun regex membuktikan hanya menulis.


Penjelasan Regex:

  • s /// berarti mengganti apa antara yang pertama // dengan apa yang ada di antara kedua //
  • "g" pada akhirnya adalah pengubah yang berarti "semua contoh, bukan hanya pertama"
  • ^ (dalam konteks ini) berarti awal baris
  • $ (dalam konteks ini) berarti akhir baris

Jadi, menggabungkan semuanya:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

112
2018-03-22 17:31



Unix /Cygwin hanya, pipa melalui 'tr':

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

N.B .: Ini tidak menangani koma yang disematkan, maupun tab yang disematkan.


68
2017-10-11 15:19



Solusi OUTFILE yang diberikan oleh Paul Tomblin menyebabkan file yang akan ditulis pada server MySQL itu sendiri, jadi ini akan bekerja hanya jika Anda punya MENGAJUKAN akses, serta akses masuk atau sarana lain untuk mengambil file dari kotak itu.

Jika Anda tidak memiliki akses tersebut, dan keluaran yang dibatasi tab adalah pengganti CSV yang wajar (misalnya, jika tujuan akhir Anda adalah mengimpor ke Excel), maka solusi Serbaut (menggunakan mysql --batch dan secara opsional --raw) adalah cara untuk pergi.


33
2018-06-22 13:48



Bagaimana tentang:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

30
2017-11-10 18:41