【问题标题】:MySQL query to print output as CSV to standard outputMySQL查询将输出作为CSV打印到标准输出
【发布时间】:2011-04-26 04:19:03
【问题描述】:

我想做以下mysql -uuser -ppass -h remote.host.tld database < script.sql

其中script.sql 包含以下内容

SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'

我希望将 CSV 输出定向到标准输出。原因是因为使用INTO OUTFILE 'blah.csv' 运行此查询会将文件保存在远程主机上。我希望文件保存在本地主机上。

如果我可以将标准输出重定向到一个文件,那就太棒了。

【问题讨论】:

标签: mysql sql into-outfile


【解决方案1】:

上面的答案似乎没有完全回答最初的问题,我也不确定这是否也可以,但希望这可能对某人有所帮助:

有关如何sed 的许多cmets,请参见How to output MySQL query results in CSV format?。例如,基于原始参数,以下可能就足够了:

mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e "SELECT * FROM webrecord_wr25mfz_20101011_175524;" | sed 's/\t/,/g' 2>&1

这类似于上面的答案,但重定向到stdout 而不是blah.csv

但是,(虽然不确定如果您需要保留制表符是否可行,但有很多方法可以解决此问题),我使用https://stackoverflow.com/a/2543226/2178980 正确转义双引号并转换为逗号分隔:

mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e "SELECT * FROM webrecord_wr25mfz_20101011_175524;" | perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g' 2>&1
  • 通过mysql 执行sql "SELECT * FROM webrecord_wr25mfz_20101011_175524;"(此输出将以制表符分隔)
  • 通过管道转换为逗号分隔的perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g'
  • 通过附加2>&1 将输出转到stdout

【讨论】:

    【解决方案2】:

    部分重复问题MySQL SELECT INTO OUTFILE to a different server。没有into outfile就不能使用FIELDS TERMINATED BY

    一个(不那么优雅的)替代方法是使用--batch 选项来生成制表符分隔的输出并sedding 标准输出。像这样的:

    mysql --batch -uuser -ppass -h remote.host.tld database < stack.sql | sed 's/\t/,/g' > blah.csv
    

    请注意,--batch 会转义特殊字符,因此根据您拥有的数据及其可预测性,您可能需要更改 sed

    【讨论】:

      【解决方案3】:

      试试这个:mysql -uuser -ppass -h remote.host.tld database &lt; script.sql 2&gt; blah.csv

      这将重定向标准错误

      【讨论】:

      • 这似乎并不能解决问题,即如果您不指定 OUTFILE,您将无法使用后续的“FIELDS TERMINATED BY”,因此您实际上会得到 CSV 输出!
      猜你喜欢
      • 2013-05-01
      • 2015-02-01
      • 2016-10-14
      • 2015-08-31
      • 1970-01-01
      • 2018-12-25
      • 2018-08-10
      • 1970-01-01
      • 2012-04-14
      相关资源
      最近更新 更多