2011-05-01 22 views
1

我正在尝试编写一个bash脚本,该脚本将给定本地MySQL数据库的名称,将其所有表中的数据导出为带有标题的CSV文件包含字段名称的行。例如,如果数据库有表customers,ordersinventory,我想转储三个文件customers.csv,orders.csvinventory.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的有表customersordersinventory。该命令将在目录/ 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文件中。

理想的剧本我想写将做到以下几点:

  1. 运行mysqldump命令我上面详述。
  2. 遍历所有匹配的文件/tmp/db/*.sql,并为每个:
    1. 解析出字段名,并生成一个“串”,“的”,“他们”,“喜欢” ,“this”
    2. 在匹配的.txt文件中,在第一行之前插入字段名称的字符串。
  3. 将所有.txt文件重命名为.csv并删除所有.sql文件。

任何提示?我一整天都在修补这件事,直到我弄明白为止。

回答

2

我在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 

如果这是你在找什么,它是简单的创建与循环中的所有表游标的存储过程在模式中,并为每一个做同样的事情。让我知道。 :)

0

我无法找到一个方法来做到这一点,因为:

  • 我的数据库服务器是
  • 远程计算机没有NFS
  • 也不写入共享的能力在我的本地。

我做了一个标准的SQL转储,并将该文件格式化为CSV格式。

0
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; 
相关问题