MySQL查询将输出作为CSV打印到标准输出

MySQL查询将输出作为CSV打印到标准输出,mysql,sql,into-outfile,Mysql,Sql,Into Outfile,我想执行以下mysql-uuser-ppass-h remote.host.tld数据库&1 可能的重复不是重复,这是一个关于路由到标准输出的问题。这似乎无法解决问题,即如果不指定输出文件,则无法使用后续的“终止于”字段,因此您实际上可以获得CSV输出!

我想执行以下
mysql-uuser-ppass-h remote.host.tld数据库

其中
script.sql
包含以下内容

SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'
我希望CSV输出定向到标准输出。原因是,在OUTFILE'blah.csv'
中使用
运行此查询将在远程主机上保存文件。我希望文件保存在本地主机上


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

试试这个:
mysql-uuser-ppass-h remote.host.tld数据库blah.csv


这将把部分重复的问题重定向到stderr<代码>字段以
结尾,如果未将放入输出文件

一种(不那么优雅的)替代方法是使用该选项生成制表符分隔的输出并对标准输出进行排序。大概是这样的:

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

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

上面的答案似乎不能完全回答原始问题,我也不确定这是否会转义,但希望这可能会对某些人有所帮助:

有关如何
sed
的许多注释,请参阅。例如,基于原始参数,以下可能就足够了:

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

但是,(虽然不确定如果需要保留制表符,这是否有效,但是有很多方法可以解决这个问题),我已经使用过正确地转义双引号并转换为逗号分隔的:

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
    “从webrecord_wr25mfz_20101011_175524;中选择*”
    (此输出将以制表符分隔)
  • 转换为逗号,由管道分隔为
    perl-lpe的/“/\”/g;s/^ |$/“/g;s/\t/”,“/g”
  • 通过添加
    2>&1

可能的重复不是重复,这是一个关于路由到标准输出的问题。这似乎无法解决问题,即如果不指定输出文件,则无法使用后续的“终止于”字段,因此您实际上可以获得CSV输出!