列名从MySQL到CSV文件

时间:2013-12-05 16:12:08

标签: mysql sql excel csv

我在数据库中有一个表,我希望将其用作联系人表格以导入Outlook。

我想要导入的是:

名字|电子邮件

andy | ds@ds.com< - 输入姓名和电子邮件

目前我有这段代码:

(SELECT 'Name', 'Email') 
union all
(select E_Name, Email
INTO OUTFILE '/xampp/tmp/Sample.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM email WHERE 1)

这会创建一个这样的excel文件:

A | B< - excel列名

姓名|电子邮件

andy | ds@ds.com

我知道如果我使用odbc连接提取信息,它会按照我需要的方式提取信息,但是我想要它,因此csv文件是已经在其中创建的,因此无需执行odbc方法。< / p>

4 个答案:

答案 0 :(得分:4)

我找到了解决问题的方法。会拍我自己

SELECT  *
INTO OUTFILE '/xampp/tmp/Sample.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
FROM
  (
SELECT 'Name' AS `E_Name`, 'Email' AS `Email`

UNION ALL

SELECT `E_Name`, `Email`
FROM `email`

) `sub_query`

在新线之前,我没有做回报。一旦我添加了这个csv可以导入到Outlook没有问题。感谢所有人的帮助。生病离开这个开放的任何人都有同样的问题。

* 面掌 *

答案 1 :(得分:2)

我经常发现这种情况。我所知道的最简单的方法是使用sed,这是Unix的命令行实用程序。

由于您正在使用Excel,我假设您没有* nix系统(Linux,BSD等)。所以我建议你安装Cygwin(你可以得到它here)。

然后,打开一个Cygwin bash shell并在命令提示符下写下:

mysql -h yourHost -u yourUser -pYourPassword yourDatabase -e"select e_name, email from email" | sed 's/\t/,/g' > yourOutput.csv

让我解释一下:

  1. mysql -h yourHost -u yourUser -pYourPassword yourDatabase -e"select..."在MySQL中打开一个会话,连接到yourDatabase并执行查询(-e标志用于执行查询)。默认情况下,输出以制表符分隔值的形式定向到控制台。
  2. 管道字符|用于将第一个命令的输出重定向到第二个命令,而不是将输出定向到控制台。
  3. sed 's/\t/,/g''用逗号
  4. 替换每个制表符(\t
  5. > yourOutput.csv将命令的结果重定向到名为yourOutput.csv的文件。您可以指定路径。
  6. 有关sed和重定向的更多信息:http://lowfatlinux.com


    我知道这可能很麻烦,但如果你经常这样做,这将为你节省相当多的时间和头痛(第一次是最难的,过了一段时间后结果非常简单)

    希望这有帮助


    关于您的评论:

      

    这会从mysql中获取标题,并按照odbc连接的方式在excel中创建标题吗?

    在外行术语中:ODBC连接使表或视图对客户端程序可见,因此客户端可以使用表或视图中包含的数据。当然,这意味着列名称对客户端可见。

    我上面提出的解决方案更像是将select语句的结果“导出”到文件中。

    如果您不想安装Cygwin,我会收到一些消息:>重定向操作符适用于Windows的命令窗口...但我不知道Windows命令行实用程序替换字符。如果您不介意使用制表符而不是逗号,则可以使用:

    mysql -h yourHost, -u yourUser -pyourPassword yourDatabase -e"select..." > yourOutputFile.txt
    

    这会将查询结果导出到yourOutputFile.txt文件,作为制表符分隔值(可以由excel读取)。正如我在评论中提到的,如果您为列名使用别名,这些将是要导出的列标题。

答案 2 :(得分:0)

根据我对INSERT INTO的理解,您的查询格式错误,因为它只是将第二个插入内容写入输出文件。

试试这个(测试过)

SELECT  *
INTO OUTFILE '/xampp/tmp/Sample.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM
  (
    SELECT 'Name' AS `E_Name`, 'Email' AS `Email`

    UNION ALL

    SELECT `E_Name`, `Email`
    FROM `email`
    WHERE 1
  ) `sub_query`

注意:不确定为什么需要WHERE子句,这可能会被删除。关键点是在子查询中合并查询,然后将其写入文件。

答案 3 :(得分:0)

下面的查询会在concat组上进行所有合并(以动态获取字段名称)和实际数据。

-- group concat default is 1024, to avoid field names getting truncated we increase this value
SET SESSION group_concat_max_len = 10000;

SELECT 
    CONCAT('SELECT * INTO OUTFILE \'/home/myuser/myfile.csv\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\n\' FROM (SELECT ',
            GROUP_CONCAT(CONCAT('\'', COLUMN_NAME, '\'')),
            ' UNION select * from YOUR_TABLE) as tmp')
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE
    TABLE_NAME = 'YOUR_TABLE'
    AND TABLE_SCHEMA = 'YOUR_SCHEMA'
ORDER BY ORDINAL_POSITION;