首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >解析mysqldump的输出以创建带有字段名头的CSV文件

解析mysqldump的输出以创建带有字段名头的CSV文件
EN

Stack Overflow用户
提问于 2011-05-01 17:25:58
回答 3查看 4K关注 0票数 1

我正在尝试编写一个bash脚本,它将根据本地MySQL数据库的名称,将数据从其所有表导出到包含字段名的头行的CSV文件中。例如,如果数据库有表customersordersinventory,我想转储三个文件-- customers.csvorders.csvinventory.csv,包括每个文件头中的字段名。

通过修改mysqldump,我成功地生成了所需的所有.csv文件,但没有字段名标题行。该命令还在SQL命令中创建一组仅包含表结构的.sql文件。在谷歌搜索了很多之后,我找不到任何能够解决这个问题的人,而不需要“重新发明轮子”并编写自己的MySQL转储脚本。mysqldump很棒,它只是缺少这一小功能。我需要的所有字段名都在这些SQL文件中,这应该是一个解析它们并在每个CSV文件中添加一行字段名的问题,对吗?

我的问题是:我是一个shell脚本新手,我不知道该怎么做。

下面是我目前使用的mysqldump命令:

代码语言:javascript
代码运行次数:0
运行
复制
mysqldump --host=localhost --user=myusername --password=mypassword \
          --tab=/tmp/db/ --verbose mydatabase \
          --fields-enclosed-by=\" --fields-terminated-by=,

假设数据库mydatabase有表customersordersinventory。此命令将在/tmp/db目录中生成6个文件:customers.sqlcustomers.txtorders.sqlorders.txtinventory.sqlinventory.txt。( txt文件是CSV文件,我的脚本稍后将文件扩展名更改为.csv)

.sql文件如下所示(以客户为例):

代码语言:javascript
代码运行次数:0
运行
复制
-- 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 .“之后的.sql文件中。

我试图编写的理想脚本是这样做的:

  1. 运行前面详细介绍的mysqldump命令。
  2. 循环遍历匹配/tmp/db/*..sql的所有文件,并为每个文件循环:

代码语言:javascript
代码运行次数:0
运行
复制
1. parse out the field names and generate a "string","of","them","like","this"  
2. in the matching .txt file, insert the string of field names before the first line.  

  1. 将所有.txt文件重命名为.csv,并删除所有.sql文件。

有小费吗?在我弄清楚之前,我会一整天都在修理这个东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-01 18:12:34

我在窗户下做了一个简单的测试。

代码语言:javascript
代码运行次数:0
运行
复制
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的内容:

代码语言:javascript
代码运行次数:0
运行
复制
id,fname,lname,dob
1,nick,smith,2000-12-05
2,john,white,1990-12-05 

如果这正是您所要寻找的,那么创建一个带有游标的存储过程非常简单,该游标可以循环模式中的所有表,并对每个表执行相同的操作。让我知道。:)

票数 2
EN

Stack Overflow用户

发布于 2012-08-15 18:55:22

考虑到这一点,我想不出办法来:

  • my服务器是一台远程机器,具有
  • 、无NFS
  • 、以及在本地.

上写入共享的能力。

我做了一个标准的SQL转储,grep将文件转换成CSV格式。

票数 0
EN

Stack Overflow用户

发布于 2013-04-30 11:20:13

代码语言:javascript
代码运行次数: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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5850059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档