如何在屏幕上以CSV格式输出MySQL查询结果(而不是保存为文件)?

28

我正在尝试使用mysql命令行工具以逗号分隔的格式输出查询结果。我的mysql用户无法使用此问题中引用的“INTO OUTFILE”选项。

如何以CSV格式输出MySQL查询结果?

我也知道使用-H和-X选项将输出格式化为html和xml,但是有没有直接将csv格式输出到屏幕的方法?

我发现了这个使用sed的方法-http://tlug.dnho.net/?q=node/209。但是,我很想找到一个直接的mysql解决方案。

有什么想法吗?

9个回答

21

3
您可以使用“--silent”选项来删除表格输出。请参见http://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html#option_mysql_silent。 - Nobu
注意使用CONCAT_WS()函数,因为它会跳过NULL值(导致列数不均匀)。您可能需要使用类似于IFNULL(column, '')的东西来避免这个问题。 - Marco Roy

9
将答案通过管道传输到tr,就像这样:
mysql <blah blah> -B | tr '\t' ','

啊,它错过了尖括号里的东西...我的意思是mysql {blah blah} -B ... - Dom Storey

4
mysql --raw --skip-column-names -u someuser -psomepass -h somehost -b somedatabase -e "select * from somedatabase.sometable;"| awk -F\\t '{print $1","$2","$3}'

-F\\t tells awk to use a tab as the delimeter on its input, and we print out the desired columns with commas as delimeters using the "," bit.  Replace "," with ":" or "|" or whatever to suit your needs.

如果你需要引用一个输出字段,比如 $1,你的 awk 打印语句应该像这样:
awk -F\\t '{print "\""$1"\","$2","$3}'

4

我使用MySQL已经多年了,我不知道是否有任何方法可以使用mysql命令行客户端单独生成CSV输出,除了你已经找到的解决方案。

目前已有一些关于支持CSV输出的功能请求已被记录:

我建议的另一种解决方案是使用Perl或PHP编写脚本,从MySQL中获取数据并以CSV格式或任何其他格式输出。这不是一个难写的脚本。

很高兴知道我没有错过什么显而易见的东西。谢谢! - RyanW

3
如果您可以访问mysqldump,您可以使用以下类似的方法:
mysqldump -u [username] -p -t -T/path/to/directory [database] --fields-enclosed-by=\; --fields-terminated-by=,

谢谢您的建议。我认为这可以解决我的权限问题。但我还需要进一步过滤记录和字段,因为它会转储整个表格,而我只想获取表格的一个小子集。 - RyanW
1
最近版本的mysqldump提供了一个-w参数,用于向转储表提供WHERE子句。 - staticsan
谢谢,那将是一个很好的选择。 - RyanW
只有当您可以访问数据库服务器时,此方法才有效,因为“-T / path / to / directory”是指MySQL服务器上的目录,而不是本地计算机上的目录。因此,这种方法无法用于大多数云中的数据库。 - Marco Roy

2
更改MySQL命令行结果的输出格式为CSV之后,执行以下命令:
mysql --skip-column-names --batch -e 'select * from dump3' t | awk -F'\t' '{ sep=""; for(i = 1; i <= NF; i++) { gsub(/\\t/,"\t",$i); gsub(/\\n/,"\n",$i); gsub(/\\\\/,"\\",$i); gsub(/"/,"\"\"",$i); printf sep"\""$i"\""; sep=","; if(i==NF){printf"\n"}}}'

1
嗨,因为所有这些解决方案都传播了同样的错误。不满足CSV格式的基本规则:https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules
  • 带有嵌入逗号或双引号字符的字段必须加引号。
  • 每个嵌入的双引号字符必须由一对双引号字符表示。
  • 带有嵌入换行符的字段必须加引号。
只有当值中没有逗号、双引号或换行符时,结果才是正确的。
- Artur Siara
1
例如,这两列的结果无法正确读取: mysql> select * from csvdata; | column1 | column2 | +--------------------------+----------------------------------+ | Super, "luxurious" truck | Second column, and another comma |使用SELECT CONCAT_WS命令进行回答 `mysql> SELECT CONCAT_WS(',',column1, column2) from csvdata; +-----------------------------------------------------------+| Super, "luxurious" truck,Second column, and another comma |` - Artur Siara
1
好的,那很有道理。不过你应该把它添加到答案中,特别是因为它已经超过7年了,而且包含一个被接受的解决方案。 - Mike
感谢您的关注。除了对当前评论进行评论之外,如何实现这一点?而且我甚至没有足够的声望来发表评论。 - Artur Siara
在您的答案下面有一个“编辑”链接。点击它,您可以编辑自己的答案。即使您没有任何声望点,您也可以随时编辑自己的问题和答案。但是,如果您编辑其他人的问题和答案,则需要得到其他5个人的批准才能生效。 - Mike
显示剩余3条评论

2
如果您已安装MySQL Workbench,可以运行查询,然后点击结果上方的“导出”。它会给您保存为 .CSV 文件的选项。

1
如果您正在交互式地使用mysql,您可以像这样设置您的分页器来使用sed:
$ mysql -u <user> p<passwpd>
mysql> pager sed 's/,/\n/g'
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah

.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"

如果您不使用 see 作为分页器,则输出如下:
"blah":"blah","blah":"blah","blah":"blah"

1

CLI 可以输出制表符分隔的格式,这几乎足够好(我是从经验中说的)。使用 -B 选项。制表符分隔的最大问题是我无法让 Excel 导入该格式。但是,OpenOffice 可以。


没错,我使用了-B选项,并将输出复制到Numbers中,它似乎可以很好地接受它。 - RyanW
1
谢谢,这个方法很有效。然后您可以使用sed将其转换为CSV格式。在Sed语句中输入制表符之前,请确保键入Ctrl-V。mysql -B -uroot foo -e 'SELECT email,country FROM email_signups' | sed -e 's/<Ctrl-V><tab>/,/g' > foo.csv - Andrew Hopper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接