【问题标题】:Convert mysql query results to CSV (with copy/paste)将 mysql 查询结果转换为 CSV(使用复制/粘贴)
【发布时间】:2011-01-05 05:33:03
【问题描述】:

我经常在命令行 mysql 中工作。一个常见的需求是获取查询结果并将它们导入Numbers 文档(类似于 Excel 文档)。

最快的方法是什么?

方法一:选择入outfile

您可以直接从 MySQL 中选择输出文件,但这需要几个步骤。

  1. 导出带有所有必要参数的查询以使其成为 CSV 格式,例如 FIELDS OPTIONALY ENCLOSED BYDELIMITED BY
  2. sftp 进入服务器并抓取文件
  3. 从服务器中删除文件

方法二:复制/粘贴

我倾向于使用这种方法。对我来说,这似乎快了一点,但这主要是因为我不记得如何从上面构造SELECT INTO OUTFILE 查询并且必须查找它。

  1. 复制/粘贴到本地文本文件
  2. 在文本编辑器中打开并替换 |与,
  3. 另存为 CSV 并在 Numbers 中打开。

【问题讨论】:

  • “ssh 进入服务器并抓取文件”是什么意思?还是你的意思是 sftp?
  • 我会更正原帖。谢谢。

标签: mysql csv export numbers


【解决方案1】:

您还可以使用带有-e 选项的mysql 命令行实用程序并将输出通过管道传输到文件。这将以制表符分隔的格式输出数据。

【讨论】:

  • 这应该生成 CSV 吗? mysql -e "show databases;"。它似乎是带有 | 而不是逗号的正常 mysql 输出。
  • @Lucas Oman:错误。 mysql -e 将给出 TAB 分隔的输出,如果 mysql 被传送到其他东西或者如果与 -B (batch) 选项一起使用。
【解决方案2】:

我认为您的选项 1 是最好的 - 执行一次并打印正确的选项,或者更好的是,创建一个小脚本来接受查询并自动添加您最喜欢的封闭和分隔符选项。

如果您自己为您的客户端平台安装 mysql 客户端实用程序,并尽可能从您的工作站直接连接到 mysql 服务器,您也可以跳过第 2 步和第 3 步。

【讨论】:

    【解决方案3】:

    您可以在本地计算机上执行SELECT ... INTO OUTFILE 查询,并让它在本地保存文件。如果您在本地安装了mysql* 命令行实用程序,只需添加-h <ip-address> 标志即可连接到特定主机。 mysql 也可以从标准输入中读取,因此您可以设置一个用于导入的 .sql 文件。

    SQL 文件 (outfile.sql):

    SELECT * FROM myTable WHERE date>CURDATE()
    INTO OUTFILE '/home/me/outfile.csv' -- Specify output file (if Windows, make sure
                                        -- to use backslashes and escape them 
                                        -- (C:\\Users\\<user>\\...)
    FIELDS
        OPTIONALLY ENCLOSED BY '"'
        ESCAPED BY '"' -- Results in double quotation marks, which I have found Excel
                       -- requires (instead of using a backslash to escape)
        TERMINATED BY '\\n' -- or your line ending of choice
                            -- (i believe escaping is required)
    

    然后你会发出以下命令:

    mysql -u <user> -p -h <server_ip_address> <outfile.sql
    

    请注意,创建一个可以从您的远程 IP 地址连接的新用户可能是个好主意,该用户具有FILE 权限并且只有SELECT 可以访问您需要查询的表。

    一开始有点设置,但最后,您可以将mysql 命令粘贴到批处理文件中并使其成为两次单击过程。

    *我相信你必须下载完整的MySQL系统,它带有mysql CLI。

    【讨论】:

      【解决方案4】:

      Excel 在Data 菜单下有一个Text to Columns 功能,可让您指定自定义分隔符。我猜 Numbers 会有类似的功能。如果是这样,那么解决方案是直接复制并粘贴到您的 Numbers 文档中,然后将这些文本单元格转换为指定 | 作为分隔符的列。

      【讨论】:

        【解决方案5】:

        这个怎么样?

        mysql -B -e "$MY_QUERY" > my_data.csv

        输出格式实际上是制表符分隔而不是逗号分隔 但至少 Excel 和 OpenOffice Calc 会自动适应这一点。

        顺便说一句,为了方便和启用非交互式执行 mysql 命令,我强烈建议设置一个安全的 ~/.my.cnf 文件
        (只有您可以阅读)带有这样的条目:

        [client]
        user=YOUR_MYSQL_USER_NAME
        password=YOUR_MYSQL_PASSWORD
        host=YOUR_MYSQL_SERVER
        port=YOUR_MYSQL_SERVER_PORT
        WHATEVER_OTHER_OPTIONS_YOU_LIKE
        

        参考资料:

        http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html

        --批处理,-B

        使用制表符作为列分隔符打印结果,每行换行。使用此选项,mysql 不使用历史文件。

        批处理模式导致非表格输出格式和特殊字符转义。使用原始模式可以禁用转义;请参阅 --raw 选项的说明。

        【讨论】:

        • 您的示例使用“-b”,它是“-B”(您稍后会指出)。
        • 感谢您的关注。我已经编辑了答案以更正它。
        【解决方案6】:

        使用您的第一种方法并进行以下修改:

        您可以在本地机器上运行它并直接保存文件,而不是在服务器上运行命令,而无需 sftp 和删除它。为此,您必须将 mysql 端口 ssh 转发到本地计算机上的空闲端口。

        ssh -L 3306:localhost:3306 user@remoteserver
        

        第一个“3306”是本地机器上的端口。 “localhost”是指远程服务器的主机名。第二个“3306”是远程机器上的端口,需要转发。如果 MySQL 服务器在不同的端口上运行,则必须改用该端口。登录后,只要您想工作,就可以保持 ssh 会话打开。

        然后您可以在一个新的终端窗口中启动您的 mysql 会话。

        mysql -hlocalhost -uUser -p --port=3306
        

        这种方法的优势在于,您不必将 MySQL 服务器暴露在 Internet 上,并且通过加密隧道传输所有数据。

        【讨论】:

        • 很好的答案。这正是我一直在寻找的。不过,我在错误的答案上点击了“接受答案”,很抱歉你没有得到赏金积分。我欠你一杯啤酒。
        【解决方案7】:

        如果您的 mysql 输出文件很大,并且再次运行查询需要几分钟,请在 bash 中运行此命令:

        egrep -v "^\+" output.txt|sed 's/^|\s*//g'|sed 's/\s*|$//g'|sed 's/\s*|\s*/,/g' &gt; output.csv

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-15
          • 2017-10-03
          • 2013-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-18
          • 1970-01-01
          相关资源
          最近更新 更多