解析mysqldump的输出以创建具有字段名标题的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文件。在谷歌搜索了很多之后,

我正在尝试编写一个bash脚本,该脚本将在给定本地MySQL数据库名称的情况下,将所有表中的数据导出到CSV文件中,其中头行包含字段名。例如,如果数据库中有表
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…”之后

我尝试编写的理想脚本将执行以下操作:

  • 运行上面详述的mysqldump命令
  • 循环遍历与/tmp/db/*.sql匹配的所有文件,对于每个文件:
  • 解析字段名并生成“字符串”、“of”、“them”、“like”、“this”
  • 在匹配的.txt文件中,在第一行之前插入字段名字符串
  • 将所有.txt文件重命名为.csv并删除所有.sql文件
    有什么建议吗?我整天都在摆弄这个问题,直到我弄明白为止。

    我在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
    • 也没有能力在我的本地网站上写一份分享
    我做了一个标准的SQL转储,并将文件转换成CSV格式

    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;