0

我正在尝试解析 SELECT INTO OUTFILE 的 CSV 输出。(目的是将数据批量加载到外部 NoSQL 数据库中;批量加载器需要特定的文件格式,所以我正在编写一个生成器)

我的主要问题是转义字符的处理 - 特别是 FIELDS TERMINATED BY 字符。当分隔符出现在列值中时,MySQL 似乎没有转义分隔符。

我的查询的导出选项如下:

FIELDS
    TERMINATED BY ','
    ENCLOSED BY '"'
    ESCAPED BY '\\'
LINES
    TERMINATED BY '\n'

我得到 CSV 行,例如:

"value1","some, value","another value","value3"

这会破坏我的 CSV 行解析器,它只是使用 FIELDS TERMINATED BY 字符拆分行。

即我的解析器产生以下列值:

  • 价值1
  • 一些
  • 价值
  • 另一个值
  • 价值3

"some" 和 "value" 应该被解析为一个完整的字符串 "some, value"

解析 SELECT INTO OUTFILE 输出的正确方法是什么?

考虑到上述导出选项,我还有什么需要担心的吗?我的代码已经在列值中处理了以下情况:

(按确切顺序)

  • 将 \N 列值视为 NULL
  • 用。。。来代替 ”

笔记:

如果有人能提供 MySQL 的 LOAD DATA INFILE 的伪代码,那就太好了。该声明的确切行为是我试图效仿的。

笔记:

我的解析器是用 Java 编写的,但我可以更好地理解 PHP

4

1 回答 1

0

我最终使用了OpenCSV;尽管我必须为 MySQL 转储为“\N”的 NULL 值编写一个特殊的处理程序。幸运的是,我的模式没有任何可为空的字符串字段,因此我可以安全地假设所有出现的“\N”都是 NULL。

感谢@Doge 提醒我不要重新发明轮子 :)

于 2014-04-22T08:50:27.000 回答