MySQL导出到outfile:CSV转义字符

我有一个时间表的数据库表与一些常见的feilds。

id, client_id, project_id, task_id, description, time, date 

有更多,但那是它的要点。

我在该表上运行一个导出到CSV文件的导出,以便为用户提供其数据的备份。 它也被用来作为一个macrosExcel文件的数据导入与一些自定义报告。

这一切都与我一起循环使用php的时间表,并打印到一个文件的行。

问题是一个大的数据库可能需要几个小时才能运行,这是不可接受的。 所以我用MySQL INTO OUTFILE命令重写了它,并将其减less到几秒钟,以便运行,这非常棒。

现在的问题是我似乎无法逃避描述字段中的所有新行字符等。 真的,用户可以在这里input潜在的任何字符组合,包括回车/换行。

这是我有的MySQL代码片段:

 SELECT id, client, project, task, REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, time, date INTO OUTFILE '/path/to/file.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM .... 

但…

当我尝试查看输出文件的源代码时,文件中仍然存在换行符,因此Excel的CSV导入将打破Excel向导创build的所有花式macros和数据透视表。

任何关于最佳行动的想法?

我认为你的陈述应该是这样的:

 SELECT id, client, project, task, description, time, date INTO OUTFILE '/path/to/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM ts 

主要是没有FIELDS ESCAPED BY '""'选项, OPTIONALLY ENCLOSED BY '"'将会执行描述字段等的操作,而您的数字将被视为Excel中的数字(不是由数字组成的string)

也请尝试拨打:

 SET NAMES utf8; 

在outfileselect之前,这可能有助于获得内联字符编码(所有UTF8)

让我们知道您的身体情况如何。

这里是什么工作在这里:模拟Excel 2003(另存为CSV格式)

 SELECT REPLACE( IFNULL(notes, ''), '\r\n' , '\n' ) AS notes FROM sometables INTO OUTFILE '/tmp/test.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n'; 
  1. Excel为行分隔符保存\ r \ n。
  2. Excel在列数据中为换行符保存\ n
  3. 必须先将数据replace为\ r \ n,否则Excel将认为它是下一行的开始。

如果您尝试以下操作会发生什么?

而不是你的双REPLACE语句,请尝试:

 REPLACE(IFNULL(ts.description, ''),'\r\n', '\n') 

另外,我认为它应该是LINES TERMINATED BY '\r\n'而不是'\n'

没有真正看到你的输出文件进行确认,我的猜测是你必须摆脱FIELDS ESCAPED BY值。

MySQL的FIELDS ESCAPED BY可能performance为两个方面,你不指望:(1)它只是一个字符,所以在你的情况下,它可能只是一个引号; (2)它被用于在MySQL认为需要转义的每个字符之前,包括FIELDS TERMINATED BY和LINES TERMINATED BY值。 这对于大部分的计算机世界来说都是有意义的,但这并不是Excel所逃脱的方式。

我认为你的双REPLACE正在工作,而且你正在用空格(在Windows风格的换行符的情况下是两个空格)成功replace字面换行符。 但是,如果你的数据中有逗号(文字,而不是字段分隔符),那么前面会加上引号,而Excel的处理与MySQL的处理方式大不相同。 如果是这样的话,那么错误的换行符的换行符实际上就是MySQL用作行终止符的换行符。

可能不会帮助,但你可以尝试创build一个CSV表格与该内容:

 DROP TABLE IF EXISTS foo_export; CREATE TABLE foo_export LIKE foo; ALTER TABLE foo_export ENGINE=CSV; INSERT INTO foo_export SELECT id, client, project, task, REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, time, date FROM ....