MySQL query to print output as CSV to standard output
我想做以下 mysql -uuser -ppass -h remote.host.tld database < script.sql
其中 script.sql 包含以下
我希望将 CSV 输出定向到标准输出。原因是使用 INTO OUTFILE 'blah.csv' 运行此查询会将文件保存在远程主机上。我希望将文件保存在本地主机上。
如果我可以将标准输出重定向到一个文件,那就太棒了。
- 将 MySQL 命令行结果的输出格式更改为 CSV 的可能重复项
-
不是骗子,这是关于路由到标准输出的问题。
上面的答案似乎没有完全回答最初的问题,我也不确定这是否也可以,但希望这可能对某人有所帮助:
请参阅如何以 CSV 格式输出 MySQL 查询结果?很多关于如何 sed 的评论。例如,根据原始参数,以下内容可能就足够了:
1
| 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 正确转义双引号并转换为逗号分隔:
1
| 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
部分是对 MySQL SELECT INTO OUTFILE 到不同服务器的重复问题。 FIELDS TERMINATED BY 不能在没有 into outfile
的情况下使用
一个(不那么优雅的)替代方法是使用 --batch 选项来产生制表符分隔的输出和 sedding 标准输出。像这样的东西:
1
| mysql --batch -uuser -ppass -h remote.host.tld database < stack.sql | sed 's/\\t/,/g' > blah.csv |
请注意 --batch 会转义特殊字符,因此根据您拥有的数据及其可预测性,您可能需要更改 sed
试试这个:mysql -uuser -ppass -h remote.host.tld database < script.sql 2> blah.csv
这将重定向标准错误
- 这似乎并不能解决问题,即如果您不指定 OUTFILE,您将无法使用后续的"FIELDS TERMINATED BY",因此您实际上会获得 CSV 输出!