首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以CSV格式输出MySQL查询结果?

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

Stack Overflow用户
提问于 2008-12-10 23:59:52
回答 39查看 1.4M关注 0票数 1.3K

有没有一种简单的方法可以从Linux命令行运行MySQL查询并以CSV格式输出结果?

下面是我现在要做的:

代码语言:javascript
运行
复制
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

当有很多列需要用引号括起来,或者如果结果中有引号需要转义时,它会变得混乱。

EN

Stack Overflow用户

发布于 2020-09-10 21:49:41

站在of Chris Johnson的肩膀上,我扩展了2016年2月的答案,提供了一种用于阅读的自定义方言。

这个shell管道工具不需要连接到您的数据库,可以处理输入中的随机逗号和引号,并且可以很好地在Python 2和Python 3中运行!

代码语言:javascript
运行
复制
#!/usr/bin/env python
import csv
import sys

# fields are separated by tabs; double-quotes may occur anywhere
csv.register_dialect("mysql", delimiter="\t", quoting=csv.QUOTE_NONE)
tab_in = csv.reader(sys.stdin, dialect="mysql")
comma_out = csv.writer(sys.stdout, dialect=csv.excel)
for row in tab_in:
    # print("row: {}".format(row))
    comma_out.writerow(row)

使用这个print语句来说服自己它正确地解析了您的输入:)

一个重要的警告:处理回车符,^M又称为control-M,\r在Linux术语中。尽管批处理模式的MySQL输出正确地转义了嵌入的换行符,因此实际上每行只有一行(由Linux换行符\n定义),但是MySQL没有在列数据两边加上引号。如果数据项具有嵌入的回车字符,csv.reader将拒绝该输入,并显示以下异常:

代码语言:javascript
运行
复制
new-line character seen in unquoted field -
do you need to open the file in universal-newline mode?

请不要@ me说我应该使用通用文件模式,用'rU‘模式重新打开sys.stdin.fileno。我试过了,它导致嵌入的\r字符被视为记录结束标记,因此一条输入记录被错误地转换为许多不完整的输出记录。

我还没有找到一个Python解决方案来解决Python的csv.reader模块的这个限制。我认为根本原因是他们的文档中提到的csv.reader实现/限制

代码语言:javascript
运行
复制
The reader is hard-coded to recognise either '\r' or '\n' as end-of-line,
and ignores lineterminator.

我能提供的弱且不令人满意的解决方案是在Python的csv.reader看到数据之前将每个\r字符更改为两个字符的序列'\n‘。我使用了sed命令。下面是一个包含Python和上面的MySQL脚本的管道示例:

代码语言:javascript
运行
复制
mysql -u user db --execute="select * from table where id=12345" \
  | sed -e 's/\r/\\n/g' \
  | mysqlTsvToCsv.py

经过一段时间的抗争,我认为Python不是正确的解决方案。如果你能接受Perl,我认为the one-liner script offered by artfulrobot可能是最有效和最简单的解决方案。

票数 1
EN
查看全部 39 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/356578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档