【问题标题】:LOAD DATA INFILE - fields terminated by character which also appears in fieldLOAD DATA INFILE - 以字符结尾的字段,该字符也出现在字段中
【发布时间】:2015-12-02 11:12:21
【问题描述】:

我有一个大的 .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 一样快?

【问题讨论】:

  • "是否可以告诉 MySQL 将第四个字段之后的所有内容都视为第五列?"是的,按照SET fifthColumn=CONCAT(@fifthField,@sixthField)this blog post 的行。
  • 我们通常使用FIELDS TERMINATED BY '¿^?fish╔&®)'
  • 谢谢@bishop!那篇博文正是我所需要的。

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


【解决方案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", "")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2019-07-14
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2014-02-18
    相关资源
    最近更新 更多