我正在嘗試編寫一個bash腳本,該腳本將給定本地MySQL數據庫的名稱,將其所有表中的數據導出爲帶有標題的CSV文件包含字段名稱的行。例如,如果數據庫有表customers
,orders
和inventory
,我想轉儲三個文件customers.csv
,orders.csv
和inventory.csv
,包括每個文件的標題中的字段名稱。解析mysqldump的輸出以創建帶有字段名稱頭的CSV文件
修補mysqldump,我已經設法產生我需要的所有.csv文件,但沒有字段名稱標題行。該命令還會在SQL命令中創建一組僅包含表結構的.sql文件。經過大量搜索之後,我找不到任何能夠解決這個問題的人,而無需「重新發明輪子」並編寫他們自己的MySQL轉儲腳本。 mysqldump很棒,它只是缺少這個小功能。我需要的所有字段名稱都在那些SQL文件中,它只是解析它們併爲每個CSV文件添加一行字段名稱的問題,對不對?
我的問題:我是一個shell腳本新手,我不知道如何去做這件事。
這裏是我目前使用mysqldump命令:
mysqldump --host=localhost --user=myusername --password=mypassword \
--tab=/tmp/db/ --verbose mydatabase \
--fields-enclosed-by=\" --fields-terminated-by=,
假設數據庫MyDatabase的有表customers
orders
和inventory
。該命令將在目錄/ tmp/db中生成六個文件:customers.sql
,customers.txt
,orders.sql
,orders.txt
,inventory.sql
,inventory.txt
。 (在txt文件是CSV文件,我的劇本後文件擴展名更改爲.csv)
的.sql文件看起來像這樣(使用客戶爲例):
-- MySQL dump 10.13 Distrib 5.1.54, for debian-linux-gnu (i686)
--
-- Host: localhost Database: mydatabase
-- ------------------------------------------------------
-- Server version 5.1.54-1ubuntu4
/* (i removed some generated comments here) */;
--
-- Table structure for table `customers`
--
DROP TABLE IF EXISTS `customers`;
/* (i removed some generated comments here) */;
CREATE TABLE `customers` (
`customer_id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(256) NOT NULL,
`last_name` varchar(256) NOT NULL,
`email` varchar(256) NOT NULL,
`phone` varchar(20) NOT NULL,
`notes` longtext NOT NULL,
PRIMARY KEY (`customer_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1865 DEFAULT CHARSET=latin1;
/* (i removed some generated comments here) */;
-- Dump completed on 2011-05-01 13:03:02
和.txt文件看起來像你期望的CSV看起來(「數據」,「像」,「這個」)的行,但沒有字段名稱標題。
正如你所看到的,我需要的字段名在「CREATE TABLE ...」之後的.sql文件中。
理想的劇本我想寫將做到以下幾點:
- 運行mysqldump命令我上面詳述。
- 遍歷所有匹配的文件/tmp/db/*.sql,併爲每個:
- 解析出字段名,並生成一個「串」,「的」,「他們」,「喜歡」 ,「this」
- 在匹配的.txt文件中,在第一行之前插入字段名稱的字符串。
- 將所有.txt文件重命名爲.csv並刪除所有.sql文件。
任何提示?我一整天都在修補這件事,直到我弄明白爲止。