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

标签 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 将第四个字段终止后的所有内容视为第五列的一部分(直到该行终止)。这可以用 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", "")

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

关于mysql - LOAD DATA INFILE - 以字符终止的字段,该字符也出现在字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429477/

相关文章:

php - 按投票排序 - PHP

mysql - 同一查询中的 COUNT DISTINCT 和 GROUP BY 错误

PHP MySQL : User selects the fields to create mysql query array variable

mysql - 使用外键mysql更新属性值

MySQL 基于外键自增

sql - 获得每日错误的百分比

mysql - 当第一个字符是逗号时删除它

Mysql跨库外键

java - 无法从 CursorWindow 读取第 0 行,第 -1 列?

ruby-on-rails - 根据 db/schema.rb 中的内容创建模型