【发布时间】:2012-06-11 17:00:25
【问题描述】:
MySQL 有一个不错的 CSV 导入功能LOAD DATA INFILE。
我有一个大型数据集,需要定期从 CSV 导入,所以这个功能正是我所需要的。我有一个可以完美导入数据的工作脚本。
.....except....我事先不知道行尾终止符会是什么。
我的 SQL 代码目前看起来像这样:
LOAD DATA INFILE '{fileName}'
INTO TABLE {importTable}
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
( {fieldList} );
这对某些导入文件非常有用。
但是,导入数据来自多个来源。其中一些具有\n 终结符;其他人有\r\n。我无法预测我会拥有哪一个。
有没有办法使用LOAD DATA INFILE 来指定我的行可以用\n 或\r\n 终止?我该如何处理?
【问题讨论】:
-
您是否只需要处理
\n(大多数*nix 系统,包括OS X)和\r\n(Windows)——在这种情况下@Devart's answer看起来很完美——或者您是否会遇到其他行终止序列,例如\n\r(例如来自 RISC OS)、\r(例如 Mac OS 9)和其他? -
@eggyal - 这是一个非常好的问题。我只考虑了 *nix/Windows 场景,但正如我所说,导入文件的创建超出了我的控制范围,所以我想我需要满足任何需求。我采用了一个基本的预处理解决方案:Devart 的解决方案看起来很棒,但有太多弱点使其足够健壮。
-
遗憾的是,在这种情况下,我认为没有任何简单的解决方案。可以解析每个候选行终止序列的文件计数出现以试图猜测它使用哪个,但要注意包含多行文本字段的文件,其中行终止与实际记录终止不同(您可能必须计算/验证每个记录终止符之间出现的预期字段数)。我不知道您的应用程序使用什么代码/框架,但很可能有一些库可以在这里为您提供帮助。否则,提示用户告诉你它是什么。
标签: mysql csv delimiter end-of-line