LOAD DATA INFILE - 以字符终止的字段,该字符也出现在字段中
LOAD DATA INFILE - fields terminated by character which also appears in field
我有一个很大的 .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 将第四个字段终止后的所有内容视为第五列的一部分(直到该行终止)。 LOAD DATA INFILE
这可能吗?是否有产生相同结果、不需要编辑源文件且执行速度与 LOAD DATA INFILE
一样快的方法?
这是我的解决方案:
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", "")
我只是在导入后删除了最后一列。
我有一个很大的 .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 将第四个字段终止后的所有内容视为第五列的一部分(直到该行终止)。 LOAD DATA INFILE
这可能吗?是否有产生相同结果、不需要编辑源文件且执行速度与 LOAD DATA INFILE
一样快的方法?
这是我的解决方案:
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", "")
我只是在导入后删除了最后一列。