MySQL LOAD DATA INFILE:工作,但不可预测的行终止符

SDC*_*SDC 16 mysql csv delimiter end-of-line

MySQL有一个很好的CSV导入功能LOAD DATA INFILE.

我有一个大型数据集,需要定期从CSV导入,所以这个功能正是我需要的.我有一个可以完美导入数据的工作脚本.

.....除了......我事先并不知道终端终结器是什么.

我的SQL代码目前看起来像这样:

LOAD DATA INFILE '{fileName}'
 INTO TABLE {importTable}
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\n'
 IGNORE 1 LINES
( {fieldList} );
Run Code Online (Sandbox Code Playgroud)

这适用于某些导入文件.

但是,导入数据来自多个来源.其中一些有\n终结者; 其他人有\r\n.我无法预测我将拥有哪一个.

有没有使用的方式LOAD DATA INFILE来指定,我行可与任一被终止\n\r\n?我该如何处理?

Dev*_*art 11

您可以将行分隔符指定为'\n',并在加载期间从最后一个字段中删除尾随的'\ r'分隔符.

例如 -

假设我们有'entries.txt'文件.行分隔符为'\ r \n',并且只有在ITEM2 | CLASS3 | DATE2分隔符为'\n' 之后的行之后:

COL1  | COL2   | COL3
ITEM1 | CLASS1 | DATE1
ITEM2 | CLASS3 | DATE2
ITEM3 | CLASS1 | DATE3
ITEM4 | CLASS2 | DATE4
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE语句:

CREATE TABLE entries(
  column1 VARCHAR(255) DEFAULT NULL,
  column2 VARCHAR(255) DEFAULT NULL,
  column3 VARCHAR(255) DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)

我们的LOAD DATA INFILE查询:

LOAD DATA INFILE 'entries.txt' INTO TABLE entries
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(column1, column2, @var)
SET column3 = TRIM(TRAILING '\r' FROM @var);
Run Code Online (Sandbox Code Playgroud)

显示结果:

SELECT * FROM entries;
+---------+----------+---------+
| column1 | column2  | column3 |
+---------+----------+---------+
| ITEM1   |  CLASS1  |  DATE1  |
| ITEM2   |  CLASS3  |  DATE2  |
| ITEM3   |  CLASS1  |  DATE3  |
| ITEM4   |  CLASS2  |  DATE4  |
+---------+----------+---------+
Run Code Online (Sandbox Code Playgroud)


cod*_*key 10

我只是预处理它.作为导入过程的一部分,从命令行工具更改\ r \n到\n的全局搜索/替换应该简单且高效.