LOAD DATA INFILE - 由字符终止的字段,也出现在字段中

时间:2015-09-07 00:00:26

标签: mysql sql database csv load-data-infile

我有一个很大的.csv文件,我想导入MySQL数据库。我想根据速度使用LOAD DATA INFILE语句。

字段由-|-终止。行由|--终止。目前我正在使用以下声明:

LOAD DATA LOCAL INFILE 'C:\\test.csv' INTO TABLE mytable FIELDS TERMINATED BY '-|-' LINES TERMINATED BY '|--'

大多数行看起来像这样:(注意,字符串不包含在任何字符中。)

goodstring-|--|-goodstring-|-goodstring-|-goodstring|--
goodstring-|--|-goodstring-|-goodstring-|-|--
goodstring-|-goodstring-|-goodstring-|-goodstring-|-|--

goodstring是一个不包含-字符的字符串。如您所见,第二列或最后一列可能为空。像上面这样的行不会引起任何问题。但是,最后一列可能包含-个字符。可能有一行看起来像这样:

goodstring-|--|-goodstring-|-goodstring-|---|--

最后一列中的字符串--会导致问题。 MySQL检测到六列而不是五列。它在第五列中插入一个-字符,并截断第六列。正确的数据库行应为("goodstring", NULL, "goodstring", "goodstring", "--")

一个解决方案是告诉MySQL在第四个字段作为fith列的一部分被终止之后(直到该行终止)之后的所有内容。这可能是LOAD DATA INFILE吗?是否存在产生相同结果的方法,不需要编辑源文件并执行与LOAD DATA INFILE一样快的速度?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

LOAD DATA
LOCAL INFILE 'C:\\test.csv'
INTO TABLE mytable
FIELDS TERMINATED BY '-|-'
LINES TERMINATED BY '-\r\n'
(col1, col2, col3, col4, @col5, col6)
SET @col5 = (SELECT CASE WHEN col6 IS NOT NULL THEN CONCAT(@col5, '-') ELSE LEFT(@col5, LENGTH(@col5) - 2) END);

它会像这样变成一行:

goodstring-|--|-goodstring-|-goodstring-|-|--

进入这个:

("goodstring", "", "goodstring", "goodstring", NULL)

像这样的坏行:

goodstring-|--|-goodstring-|-goodstring-|---|--

进入这个:

("goodstring", "", "goodstring", "goodstring", "")

我只是在导入后删除最后一列。