解析mysqldump的输出以创建具有字段名标题的CSV文件
我正在尝试编写一个bash脚本,该脚本将在给定本地MySQL数据库名称的情况下,将所有表中的数据导出到CSV文件中,其中头行包含字段名。例如,如果数据库中有表解析mysqldump的输出以创建具有字段名标题的CSV文件,mysql,bash,csv,mysqldump,text-parsing,Mysql,Bash,Csv,Mysqldump,Text Parsing,我正在尝试编写一个bash脚本,该脚本将在给定本地MySQL数据库名称的情况下,将所有表中的数据导出到CSV文件中,其中头行包含字段名。例如,如果数据库中有表customers、orders和inventory,我想转储三个文件customers.csv、orders.csv和inventory.csv,包括每个文件标题中的字段名 通过修改mysqldump,我成功地生成了所需的所有.csv文件,但没有字段名标题行。该命令还在sql命令中创建一组仅包含表结构的.sql文件。在谷歌搜索了很多之后,
customers
、orders
和inventory
,我想转储三个文件customers.csv
、orders.csv
和inventory.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包含表客户
订单
和库存
。此命令将在目录/tmp/db中生成六个文件:customers.sql
,customers.txt
,orders.sql
,orders.txt
,inventory.sql
,inventory.txt
。(txt文件是CSV文件,我的脚本稍后将文件扩展名更改为.CSV)
.sql文件如下所示(以客户为例):
txt文件的外观与您期望的CSV相同(“数据”、“类似”、“此”)行,但没有字段名标题
如您所见,我需要的字段名就在.sql文件中“createtable…”之后
我尝试编写的理想脚本将执行以下操作:
有什么建议吗?我整天都在摆弄这个问题,直到我弄明白为止。我在windows下做了一个简单的测试
create database if not exists test;
use test;
create table csv_header(
id int not null auto_increment primary key,
fname varchar(50),
lname varchar(50),
dob date)
engine = myisam;
insert into csv_header (fname,lname,dob) values
('nick','smith','2000-12-05'),
('john','white','1990-12-05');
set @str = (select concat("select * from (select ", group_concat(concat("'",column_name,"'"))," union
select * from ", table_name, ") as t into outfile 'd:/",table_name,".txt'
fields terminated by ','
lines terminated by '\r\n'")
from information_schema.columns
where table_schema = 'test' and table_name = 'csv_header'
order by ordinal_position);
-- select @str;
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;
这是我的csv_header.txt的内容:
id,fname,lname,dob
1,nick,smith,2000-12-05
2,john,white,1990-12-05
如果这就是您要寻找的,那么创建一个带有游标的存储过程就很简单了,该游标将循环模式中的所有表,并对每个表执行相同的操作。让我知道。:) 考虑到以下情况,我找不到这样做的方法:
- 我的数据库服务器是一台远程计算机,具有
- 无NFS
- 也没有能力在我的本地网站上写一份分享
set group_concat_max_len = 5000;
set @qry = (select concat("select ",group_concat(CONCAT('''', column_name, '''' ) ), " UNION SELECT * FROM " ,table_name, ' INTO OUTFILE ', " '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' " ) from information_schema.columns where table_schema = database() and table_name = 'spree_users');
prepare stmt from @qry;
execute stmt;
deallocate prepare stmt;
set group_concat_max_len = 5000;
set @qry = (select concat("select ",group_concat(CONCAT('''', column_name, '''' ) ), " UNION SELECT * FROM " ,table_name, ' INTO OUTFILE ', " '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' " ) from information_schema.columns where table_schema = database() and table_name = 'spree_users');
prepare stmt from @qry;
execute stmt;
deallocate prepare stmt;