解析mysqldump的输出以创建具有字段名称标题的CSV文件

时间:2011-05-01 17:25:59

标签: mysql bash csv mysqldump text-parsing

我正在尝试编写一个bash脚本,在给定本地MySQL数据库名称的情况下,将所有表中的数据导出为包含字段名称的标题行的CSV文件。例如,如果数据库包含表customersordersinventory,我想要转储三个文件customers.csvorders.csvinventory.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 ordersinventory。此命令将在目录/ tmp / db中生成六个文件:customers.sqlcustomers.txtorders.sqlorders.txtinventory.sqlinventory.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. 解析字段名称并生成“字符串”,“of”,“他们”,“喜欢”,“此”
    2. 在匹配的.txt文件中,在第一行之前插入字段名称字符串。
  3. 将所有.txt文件重命名为.csv并删除所有.sql文件。
  4. 任何提示?我会一整天都在修补这个问题,直到我弄清楚。

3 个答案:

答案 0 :(得分: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 

如果这是您正在寻找的内容,则使用游标创建存储过程很简单,该游标循环架构中的所有表并为每个表执行相同的操作。让我知道。 :)

答案 1 :(得分:0)

鉴于:

,我找不到办法做到这一点
  • 我的数据库服务器是
  • 的远程计算机
  • 没有NFS
  • 也不能写入我当地的分享。

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

答案 2 :(得分: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;