MySql LOAD DATA INFILE 以逗号失败
MySql LOAD DATA INFILE failing with commas
声明如下:
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\'
这是导入良好的行:
1450327840667357185, 1, "This is my text"
如果文本字段有逗号,则失败。例如,看到这一行:
1450327840667357185, 1, "This is my text, with a comma in it"
为什么会失败?
如果我对逗号进行转义(通过在其前面放置一个反斜杠),它就可以正常工作。但这没有意义。我已经规定字段可以用双引号括起来,那为什么不接受里面的所有内容作为字段的内容呢?
如果我必须重新处理所有文本以引用逗号,那将是一项艰巨的任务。
使用Input Preprocessing。将整行加载到一个变量中,然后将其解析为单独的列。
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
-- FIELDS TERMINATED BY ''
(@tmp)
SET column1 = SUBSTRING_INDEX(@tmp, ',', 1),
@tmp = TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))),
column2 = SUBSTRING_INDEX(@tmp, ',', 1),
column3 = TRIM(BOTH '"' FROM TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))))
您的 CSV 在 ,
分隔符后有 space 秒。
我没有 MySQL 可以玩,但我希望这意味着它将那些 space 视为值的一部分,从而导致各种问题。
这意味着 CSV 行被读取为...
- VAL =
1450327840667357185
- SEP =
,
- VAL =
1
- SEP =
,
- VAL =
"This is my text
- SEP =
,
- VAL =
with a comma in it"
请注意,前导 space 包含在值中。
这意味着第三个值不是以"
开始(它以space),所以 ENCLOSED BY '"'
没有做任何事情。这意味着解析器将字符串视为 unquoted,这反过来意味着随后的 ,
被视为分隔符。
尝试TERMINATED BY ', '
...
这意味着解析器现在将该行读取为...
- VAL =
1450327840667357185
- SEP =
,
- VAL =
1
- SEP =
,
- VAL =
"This is my text, with a comma in it"
请注意,第三个值现在 以 "
开头(因为前导 space现在是分隔符的一部分),所以是一个引用字符串 等后续 ,
是 not 视为分隔符。
声明如下:
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\'
这是导入良好的行:
1450327840667357185, 1, "This is my text"
如果文本字段有逗号,则失败。例如,看到这一行:
1450327840667357185, 1, "This is my text, with a comma in it"
为什么会失败?
如果我对逗号进行转义(通过在其前面放置一个反斜杠),它就可以正常工作。但这没有意义。我已经规定字段可以用双引号括起来,那为什么不接受里面的所有内容作为字段的内容呢?
如果我必须重新处理所有文本以引用逗号,那将是一项艰巨的任务。
使用Input Preprocessing。将整行加载到一个变量中,然后将其解析为单独的列。
LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test
-- FIELDS TERMINATED BY ''
(@tmp)
SET column1 = SUBSTRING_INDEX(@tmp, ',', 1),
@tmp = TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))),
column2 = SUBSTRING_INDEX(@tmp, ',', 1),
column3 = TRIM(BOTH '"' FROM TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))))
您的 CSV 在 ,
分隔符后有 space 秒。
我没有 MySQL 可以玩,但我希望这意味着它将那些 space 视为值的一部分,从而导致各种问题。
这意味着 CSV 行被读取为...
- VAL =
1450327840667357185
- SEP =
,
- VAL =
1
- SEP =
,
- VAL =
"This is my text
- SEP =
,
- VAL =
with a comma in it"
请注意,前导 space 包含在值中。
这意味着第三个值不是以"
开始(它以space),所以 ENCLOSED BY '"'
没有做任何事情。这意味着解析器将字符串视为 unquoted,这反过来意味着随后的 ,
被视为分隔符。
尝试TERMINATED BY ', '
...
这意味着解析器现在将该行读取为...
- VAL =
1450327840667357185
- SEP =
,
- VAL =
1
- SEP =
,
- VAL =
"This is my text, with a comma in it"
请注意,第三个值现在 以 "
开头(因为前导 space现在是分隔符的一部分),所以是一个引用字符串 等后续 ,
是 not 视为分隔符。