我正在尝试编写一个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文件。
任何提示?我一整天都在修补这件事,直到我弄明白为止。