【问题标题】:BASH MySQL Query to Comma Separated FileBASH MySQL 查询到逗号分隔文件
【发布时间】:2009-09-21 15:35:53
【问题描述】:

我有以下 bash 脚本:

#!/bin/sh

MYSQLHOST="mysql.remote-host.com"
MYSQLDB="mysqldb"
MYSQLTABLE="table"
MYSQLUSER="user"
MYSQLPASS="pass"
MYSQLDUMP="Report/report.csv"
LOG="Report/report.log"

MYSQLOPTS="--user=${MYSQLUSER} --password=${MYSQLPASS} --host=${MYSQLHOST} ${MYSQLDB}"


echo "Report Begin: $(date)"
 echo "MySQL Dump Begin: $(date)" >> ${LOG}
  echo "SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} > ${MYSQLDUMP}
 echo "MySQL Dump End: $(date)" >> ${LOG}
echo "Report Successful: $(date)"

这会将我的 MySQL 查询输出到“TAB”分隔文件 report.csv。但是,我需要将其输出到“COMMA”分隔文件。我意识到我可以创建另一个脚本来将此文件从 TAB 转换为 COMMA 分隔,但是,如果可以的话,我宁愿保存该步骤。那么如何让 MySQL 以逗号分隔格式转储文件?

编辑: 我确实找到了这个解决方案:How do you output MySQL query results in csv format (to the screen, not to a file)?

但是我似乎无法让它工作:

echo "SELECT CONCAT_WS(',', ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options) FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} > ${MYSQLDUMP}

没有用:(

【问题讨论】:

    标签: bash mysql csv


    【解决方案1】:

    运行以下命令:

    echo "SELECT CONCAT_WS(',', ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options) FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | \
    mysql ${MYSQLOPTS}  | tr '\t' ',' > ${MYSQLDUMP}
    

    tr 命令将一个字符替换为另一个字符。

    【讨论】:

      【解决方案2】:

      您不需要其他脚本来执行此操作。只需更改:

      > ${MYSQLDUMP}
      

      在你的行尾阅读:

      | sed 's/\x09/,/g' > ${MYSQLDUMP}
      

      但您需要小心,您的数据中没有逗号,否则它们会被使用 CSV 文件的任何内容错误识别(但您可能已经遇到了选项卡问题)。

      【讨论】:

      • 不幸的是,这不起作用:(“product_options”字段包含被 sed 命令拾取并将它们分成新列的项目:(
      【解决方案3】:

      为什么不使用

      SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options INTO outfile '${MYSQLDUMP}' FROM ${MYSQLTABLE} FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at
      

      【讨论】:

      • 看看 Bill Karwin 的回答中留下的 cmets。我不能,因为它是托管 mysql 数据库的远程服务器,而且我没有读/写权限。
      【解决方案4】:

      这是一个输出到逗号分隔文件的example SQL 查询:

      SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
        FROM test_table;
      

      Re cmets:很公平,INTO OUTFILE 语法写入数据库服务器主机上的文件,而不是运行 shell 脚本和 mysql 客户端的主机。

      mysql 客户端没有 csv 输出模式,它只有横线表格格式(带有--table-t 标志),制表符分隔格式(带有--batch-B 标志)、HTML 格式(--html-H)和 XML(--xml-X)。

      如果您的数据库中有包含选项卡的内容,请使用REPLACE() SQL 函数将选项卡转换为其他内容,或者以其他格式之一输出并尝试将其转换为 csv:

      mysql ... --table --skip-column-names |
      sed -e 's/  *|  */,/g' \
          -e 's/^|  *//' \
          -e 's/  *|$//' \
          -e '/^+--/d'
      

      【讨论】:

      • 写入服务器上的文件,而不是标准输出。
      • @staticsan:是的,你是对的。但请注意 OP 问题中的“MYSQLHOST=localhost”。
      • 我无法让它工作:echo "SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options INTO OUTFILE 'Report/tmp2.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} > ${MYSQLDUMP} 我得到:./ report.sh:第 28 行:寻找匹配的“”时出现意外 EOF。/report.sh:第 33 行:语法错误:文件意外结束
      • 删除OPTIONALLY ENCLOSED BY '"' 子句。您不需要用双引号括起来的字段,这可能是导致 shell 脚本中引号不平衡的原因。
      • staticsan 有一点……我确实把“localhost”放在那里,但事实并非如此,MYSQL DB 存储在远程服务器上,所以这不起作用:(我删除 OPTIONALLY ENCLOSED BY: ERROR 1045 (28000) at line 1: Access denied for user 'user'@'123.456.789.0/255.255.254.0' (using password: YES)
      【解决方案5】:

      找到了一个似乎可以解决问题的简单 perl 1-liner:

      perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F '
      

      -Perl Script

      所以我的脚本中的行如下所示:

              echo "SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} | perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' > ${MYSQLDUMP}
      

      感谢所有帮助,尤其是 Bill Karwin 的帮助,我想在您的回答中添加 VoteUp,但我没有足够的声誉 :( 一旦我获得更多代表,我会回过头来投票给你的答案。 再次感谢。

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多