mysql導出數據到csv文件


在日常工作中經常會遇見導出表中的數據到csv文件的操作,這里就簡單總結一下導出的操作。

下面對csv文件的描述是摘錄:

據RFC4180文檔設置的,該文檔全稱Common Format and MIME Type for Comma-Separated Values (CSV) Files,其中詳細描述了CSV格式,其要點包括:

(1)字段之間以逗號分隔,數據行之間以\r\n分隔;

(2)字符串以半角雙引號包圍,字符串本身的雙引號用兩個雙引號表示。

這里關鍵點,我們導出的數據文件字段之間應該以逗號分隔,數據行之間應該以\r\n分隔;字段的值之間以半角雙引號包圍,字段值中的雙引號以兩個雙引號表示。

導出表數據的三種方法:

使用select .... into outfile的方法

直接在mysql的交互界面使用select命令導出數據到文件。

root@newsdb 09:53:08>select * from t_hk_stock_news where news_time > "2018.12.31 23:59:59" into outfile "/db/test.csv";
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

以上報錯需要在配置文件中指定secure_file_priv參數的值,這個值指向一個地址,導出的文件需要寫入到對應的地址中。

在不知道你個默認的情況下,導出文件中字段之間用TAB鍵隔開,每行記錄之間用\n換行符隔開,

root@newsdb 01:44:05>select * from t_hk_stock_news limit 1 into outfile "/db/test1.csv";
Query OK, 1 row affected (0.00 sec)

root@newsdb 01:44:10>
[root@test2 db]# head -n2 test1.csv 
000028952-c807-11e7-85f5-00163e12520202    1    NOW.838555    hk03337    安東油田服務(03337.HK)就現有優先票據提交換要約及額外發行票據    2017-11-13 07:35:20000000001    -1    阿思達克    \N    \N    \N    2017-11-13 07:35:25    15105293425    \N    \N    1    2f87c2337-d3d1-11e7-95494-0016233e020202    \N

可以看到對於記錄中存儲的null的值,導出的時候自動換成來\N的值的形式。

在使用select ... into  outfile導出數據的時候,可以使用如下參數指定其分隔符,以及行與行之間的換行符。

fields terminated by描述字段的分隔符,默認情況下是tab字符(\t) 
optionally enclosed by描述的是字段的括起字符。
escaped by描述的轉義字符。默認的是反斜杠(backslash:\ )  
lines terminated by : 行與行之間的分隔
root@newsdb 01:50:35>select * from t_hk_stock_news limit 3 into outfile "/db/test2.csv" fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by "\r\n";
Query OK, 3 rows affected (0.01 sec)
#數據如下
[root@test2 db]# head test2.csv
"00002752-c807-11e7-85f5-00163e020202",1,"NOW.838555","hk03337","安東油田服務(03337.HK)就現有優先票據提交換要約及額外發行票據","2017-11-13 07:35:25",1,0000000001,-1,"阿思達克","N,"N,"N,"2017-11-13 07:35:25",1510529725,"N,"N,1,"2f87c978-d3d1-11e7-9394-00163e020202","N,"2017-11-28 08:15:06"
"0000327bac35ba504d621e1140f2f775",1,"NOW.909884","hk00700","《瑞信窩輪》騰訊升逾2%撐大市美團續挫,留意騰訊購13570 / 沽15322/美團購14369 /沽14698","2018-11-26 14:07:39",1,0000000001,-1,"阿思達克","N,"N,"N,"2018-11-26 14:07:39",1543212459,"N,"N,1,"ea7916c91c037af7054f775998eda559","N,"2018-11-27 14:35:10"
"0000327bac35ba504d621e1140f2f775",1,"NOW.909884","hk01810","《瑞信窩輪》騰訊升逾2%撐大市美團續挫,留意騰訊購13570 / 沽15322/美團購14369 /沽14698","2018-11-26 14:07:39",1,0000000001,-1,"阿思達克","N,"N,"N,"2018-11-26 14:07:39",1543212459,"N,"N,1,"ea7916c91c037af7054f775998eda559","N,"2018-11-27 14:35:10"
[root@test2 db]#

null值轉換成/N的值,不知道為何只用半個雙引號,另外這個文件若用excel打開會出現亂碼的現象;可以在導出的時候指定字符集。

root@newsdb 01:56:01>select * from t_hk_stock_news limit 3 into outfile "/db/test2.csv" character set gbk fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by "\r\n";
Query OK, 3 rows affected (0.00 sec)

上面加入了指定字符集的語句,但是在excel打開的時候會出現串格的問題,多個字段顯示在同一個單元格中,特別數據庫中存儲的null值,在這里轉換為\N值時,會出現多個值顯示在一個單元格中的問題。

上面導出的數據並不包含每個字段的名字。

使用mysql命令導出數據

利用mysql的-e參數,可以導出數據,最重要的是我們可以對導出的數據進行正則處理。

如下利用mysql命令導出數據到csv文件,並且把表中的null值在excel中顯示為空。

[root@test2 ~]# mysql -e "set names gbk;select * from newsdb.t_hk_stock_news where news_time > '2019-03-31 23:59:59' limit 5" |sed -e  "s/\t/,/g" -e "s/NULL/  /g" -e "s/\n/\r\n/g" > /db/test.csv


#在-e參數中實際使用了兩條命令,一條是設置字符集,另一條是select語句,通過管道把每一行數據都通過正則來處理。
#正則中把字段之間的TAB鍵換為“,”,然后把字段值中的null替換為空字符

上面的文件內容如下:【因為字符集的問題所以產生了亂碼,但是可以看到每個字段已經導了出來】

[root@test2 db]# head -n5  test.csv 
news_id,src_type,src_id,symbol,title,news_time,content_type,news_type,is_valid,origin,author,url,website,create_time,news_t,edit_desc,news_md5,is_repeat,repeat_id,img_url,update_time
009c7c4cdf3878289c25b6f88267cb2b,3,6f8d47cf17c1bbada470ea63bc34eba4,hk01363,א͏»·±£(01363)4Ղ1ɕͣƆ ԭӲδ֪,2019-04-01 00:00:00,5,  ,-1,ׇͨ²ƾ­,  ,  ,  ,2019-04-01 09:55:02,1554048000,  ,  ,1,2c9c348790f944d39d32838b4cff1e87,  ,2019-04-01 21:16:22
0129b1dfb971aafec131f6f92c862aa9,3,d816360899e4f0049eabbac7e7cb54cb,hk01755,т³Ȕh01755)£ºϷ²ِ³Ȕď󊏺£¼τゞ¶°칫˒ϯҵ,2019-04-01 00:00:00,5,  ,-1,ׇͨ²ƾ­,  ,  ,  ,2019-04-01 21:30:04,1554048000,  ,  ,1,c2ba22ac8d15ddef1ef543ea61784029,  ,2019-04-02 14:31:18
01dbb92fba915864f2e1daa8f71dfd2c,3,bae141970e2e18a6f96e69358030a613,hk00665,4Ղ1ɕ¿ªƌǰհ |¾­¼Ċ񳭔¤ǚ ¸۹ɼ͐𳊏֧³Ƈ¿,2019-04-01 00:00:00,5,  ,1,ׇͨ²ƾ­,  ,  ,  ,2019-04-01 07:55:02,1554048000,  ,  ,0,  ,  ,2019-04-01 07:56:05
01dbb92fba915864f2e1daa8f71dfd2c,3,4d362b95079d4404f57051f64545826b,hk01788,4Ղ1ɕ¿ªƌǰհ |¾­¼Ċ񳭔¤ǚ ¸۹ɼ͐𳊏֧³Ƈ¿,2019-04-01 00:00:00,5,  ,1,ׇͨ²ƾ­,  ,  ,  ,2019-04-01 07:55:03,1554048000,  ,  ,0,  ,  ,2019-04-01 07:56:05
[root@test2 db]# 

把導出的文件用excel打開如下:

可以看到對應的null值已經變為空值,並且也沒有出現多個字段合並到同一個單元格的問題。

若不導出標題行,可以使用-N參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM