我想在命令行上从MySQL查询的输出中获取无标题CSV数据。我在与MySQL服务器不同的机器上运行这个查询,所以所有那些带有“INTO OUTFILE”的Google答案都不好。
所以我运行mysql -e "select people, places from things"
。它输出的东西看起来像这样:
+--------+-------------+
| people | places |
+--------+-------------+
| Bill | Raleigh, NC |
+--------+-------------+
那可不好但是,嘿,看!如果我只是将它传递给 anything,它会将它变成一个制表符分隔的列表:
people places
Bill Raleigh, NC
这样更好-至少它是可编程解析的。但是我不想要TSV,我想要CSV,我不想要那个头。我可以用mysql <stuff> | tail -n +2
去掉头部,但如果MySQL只是有一个省略它的标志,我想避免这个麻烦。我不能用逗号替换所有的标签,因为这不能处理带有逗号的内容。
那么,我如何让MySQL省略头部并以CSV格式给予数据呢?
9条答案
按热度按时间k2arahey1#
作为部分答案:
mysql -N -B -e "select people, places from things"
-N
告诉它不要打印列标题。-B
是“批处理模式”,使用制表符分隔字段。如果制表符分隔的值不够,请参见this Stackoverflow Q&A。
e7arh2l62#
上述解决方案仅在特殊情况下有效。你会陷入各种各样的麻烦,嵌入逗号,嵌入引号,其他事情,使CSV在一般情况下很难。
帮你自己一个忙,使用一个通用的解决方案--做对了,你就再也不用考虑它了。一个非常强大的解决方案是
csvkit
命令行实用程序-通过Python可用于所有操作系统。通过pip install csvkit
安装。这将为您提供正确的CSV数据:这将生成逗号分隔的数据,其中标头仍在原位。要删除标题行,请执行以下操作:
这是OP所要求的。
lztngnrs3#
我写了my own command-line工具来处理这个问题。它类似于
cut
,除了它知道如何处理带引号的字段等。这个工具,与@Jimothy的答案配对,允许我从一个远程MySQL服务器获取一个无头CSV,我没有文件系统访问到我的本地机器上,使用这个命令:csvmaster on github
8mmmxcuj4#
它是如何在客户端将结果保存为CSV,而无需额外的非标准工具。本例仅使用
mysql
客户端和awk
。单行:
需要做什么的逻辑解释
1.首先,让我们看看数据在RAW模式下的外观(使用
--raw
选项)。数据库和表分别为t
和dump3
您可以看到,由于值中放置了新行,从“new line”(第一行)开始的字段被拆分为三行。
1.在批处理模式下输出数据(不带
--raw
选项)-通过转义字符(如\
<tab>
和new-lines
)将每条记录更改为单行文本1.以及CSV格式的数据输出
提示是将数据保存为带有转义字符的CSV格式。
方法是将
mysql --batch
产生的特殊实体(\t
作为制表符,\\
作为反斜线,\n
作为换行符)转换为每个值(字段)的等效字节。然后整个值被"
转义,并被"
包围。顺便说一句,使用相同的字符进行转义和封闭可以稍微简化输出和处理,因为您没有两个特殊字符。出于这个原因,所有你必须做的值(从csv格式的Angular 来看)是改变"
到""
whithin值。在更常见的方式中(分别使用转义和封闭\
和"
),您必须首先将\
更改为\\
,然后将"
更改为\"
。以及命令的分步说明:
qvsjd97n5#
如何使用sed?它是大多数(所有?)Linux操作系统。
sed 's/\t/<your_field_delimiter>/g'
。本示例使用GNU sed(Linux)。对于POSIX sed(AIX/Solaris),我相信您会键入文本TAB而不是
\t
示例(对于CSV输出):
qmb5sa226#
mysqldump
实用程序可以帮助您,基本上使用--tab
选项,它是一个 Package 的SELECT INTO OUTFILE
语句。示例:
这将创建csv格式的文件
/tmp/Country.txt
6l7fqoea7#
mysql客户端可以检测输出fd,如果fd是S_IFFO(pipe)则不输出ASCII TABLES,如果fd是字符设备(S_IFCHR)则输出ASCII TABLES。
你可以使用--table来强制输出ASCII表,如:
-t,--table以表格形式输出。
omtl5h9j8#
您可以使用spyql读取mysql的制表符分隔的输出并生成逗号分隔的CSV并关闭头写入:
spyql检测输入是否有标头以及定界符是什么。默认情况下,输出分隔符为逗号。如果需要,可以手动指定所有这些选项:
我不会在mysql上关闭header写,因为spyql可以利用它,例如,如果你选择生成JSON而不是CSV:
或者,如果您需要引用列:
免责声明:我是spyql的作者
lsmd5eda9#
如果你使用的是mysql客户端,你可以设置每个会话的resultFormat,例如:
或
在这里查看完整的参数列表。