如何以 csv 格式输出 MySQL 查询结果(到屏幕,而不是文件)?

Posted

技术标签:

【中文标题】如何以 csv 格式输出 MySQL 查询结果(到屏幕,而不是文件)?【英文标题】:How do you output MySQL query results in csv format (to the screen, not to a file)? 【发布时间】:2010-10-16 23:42:00 【问题描述】:

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

How to output MySQL query results in CSV format?

我也知道 -H 和 -X 选项分别以 html 和 xml 格式输出,但是没有办法将 csv 格式直接输出到屏幕上吗?

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

CSV 输出支持的文件中有几个功能请求:

http://bugs.mysql.com/bug.php?id=5707 http://bugs.mysql.com/bug.php?id=25243

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

【讨论】:

很高兴知道我没有遗漏一些明显的东西。谢谢!【参考方案2】:

如果你可以访问 mysqldump,你可以使用类似的东西

mysqldump -u [username] -p -t -T/path/to/directory [database] --fields-enclosed-by=\; --fields-terminated-by=,

【讨论】:

感谢您的想法。我认为这可以解决我的权限问题。但我必须进一步过滤记录和字段,因为它会转储整个表,而我只是试图获取表的一小部分。 最新版本的 mysqldump 采用 -w 参数为转储表提供 WHERE 子句。 谢谢,那将是一个不错的选择。 这仅在您有权访问数据库服务器时才有效,因为-T/path/to/directory 指的是 MySQL 服务器上的目录,而不是本地计算机上的目录。所以这不能用于云中的大多数数据库。【参考方案3】:

我最终只是将制表符分隔的输出复制粘贴到电子表格,然后将其导出到 csv。还意识到我可以使用 concat 或 concat_ws 函数来完成这项工作,并且下次会这样做。

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

SELECT CONCAT_WS(',', field1, field2, field3) FROM table;

【讨论】:

您可能需要使用“--silent”选项来删除表格输出。见dev.mysql.com/doc/refman/5.5/en/… 小心CONCAT_WS(),因为它会跳过NULL 值(导致列数不均匀)。您可能需要使用 IFNULL(column, '') 之类的内容来避免此问题。【参考方案4】:

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

【讨论】:

没错,我使用了 -B 选项并将输出粘贴到 Numbers 中,它似乎可以接受它。 谢谢,效果很好。然后您可以使用 sed 将其设为 CSV。确保在 Sed 语句中的制表符之前键入 Ctrl-V。 mysql -B -uroot foo -e 'SELECT email,country FROM email_signups' | sed -e 's//,/g' > foo.csv【参考方案5】:

如果您安装了 MySQL Workbench,您可以运行查询,然后单击结果上方的“导出”。它会为您提供另存为 .CSV 的选项。

【讨论】:

【参考方案6】:

如果您以交互方式使用 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"

【讨论】:

【参考方案7】:
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'

【讨论】:

【参考方案8】:

关注Change output format for MySQL command line results to CSV

mysql --skip-column-names --batch -e 'select * from dump3' t | awk -F'\t'' sep=""; for(i = 1; i

【讨论】:

这肯定比公认的答案复杂得多。为什么这样更好? 嗨,因为所有这些解决方案都会传播相同的错误。不符合 CSV 格式的基本规则:en.wikipedia.org/wiki/Comma-separated_values#Basic_rules * 必须引用嵌入逗号或双引号字符的字段。 * 每个嵌入的双引号字符必须由一对双引号字符表示。 * 必须引用嵌入换行符的字段 只有当值中没有逗号、" 或换行符时,结果才是正确的。 例如,这两列的结果无法正确读取:mysql> select * from csvdata; |第 1 列 |第 2 列 | +--------------+---------- ------------+ |超级“豪华”卡车 |第二列,还有一个逗号 |回答 SELECT CONCAT_WS mysql&gt; SELECT CONCAT_WS(',',column1, column2) from csvdata; +-----------------------------------------------------------+ | Super, "luxurious" truck,Second column, and another comma | 用 awk 回答(sed 示例也是如此):mysql --raw --skip-column-names -uroot -p t -e 'select * from csvdata' | awk -F\\t 'print "\""$1"\","$2' "Super, "luxurious" truck",Second column, and another comma 如您所见,由于与 , 和 " 混淆,无法区分正确的字段 好的,这很有意义。不过,您应该已将其添加到答案中,尤其是因为它现在已有 7 多年的历史并且包含一个公认的解决方案。【参考方案9】:

将答案传递给tr,如下所示:

mysql <blah blah> -B | tr '\t' ','

【讨论】:

啊它错过了尖括号中的东西...我的意思是 mysql blah blah -B ...

以上是关于如何以 csv 格式输出 MySQL 查询结果(到屏幕,而不是文件)?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

将 MySQL 命令行结果的输出格式更改为 CSV

如何将 HiveQL 查询的结果输出到 CSV?