在MySQL LOAD DATA INFILE

时间:2017-10-13 16:14:02

标签: java mysql csv

我有一个函数可以提供有关DynamoDb表上完成的更新/插入的数据。对于每个upsert,我需要解析数据并将其映射到相应的MySQL表模式。我将这些数据加载到一个文件中并执行MySQL提供的LOAD DATA INFILE语句。

我的陈述看起来像这样:

LOAD DATA FROM S3 FILE '%s' REPLACE INTO TABLE %s FIELD TERMINATED BY ',' LINES TERMINATED BY '\\n'"

文件中的每一行都可能如下所示。

  

orderNumber123,ABC先生,纽约第五街,100,12-12-17

但问题是数据中的某些字段包含逗号','。现在这会导致问题,因为这个逗号被SQL解释为字段的终止符。

故障陈述可能如下所示。

  

orderNumber456,XYZ先生,新泽西州第三大道,100,12-12-17

我可以提供哪种现场终结器来避免此问题?我知道没有办法完全阻止这种情况,但我问的是什么是最不可能的方法。

我考虑过使用tab,但这也可能是数据的一部分。

更新:

根据[Ike Walker]提供的答案,用双引号括起字段就可以了。当然这意味着我必须进一步装饰我的数据,但我怀疑这是唯一有保障的方式。

此外,如果字段中有任何引号,则SQL语句足够智能,不会将其识别为封闭字符,除非它后跟终止字符(因此在我们的情况下",将是提示终止一个领域)。 不幸的是,我有数据,这个模式是字段的一部分。例如,

  

{type:long,range:“LONG”,“INT”,金额:100}

为了使SQL将其视为单个字段,我必须用双引号替换每个双引号。

  

{type:long,range:“”LONG“”,“”INT“”,金额:100}

有关此here的更多信息:

  

如果该字段以ENCLOSED BY字符开头,则为该实例   只有在遵循的情况下,才会将字符识别为终止字段值   由字段或行TERMINATED BY序列。为避免歧义,   字段值中出现的ENCLOSED BY字符可以是   加倍并被解释为角色的单个实例。对于   例如,如果指定了ENCLOSED BY'“',则处理引号   如下所示:

"The ""BIG"" boss"  -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss

1 个答案:

答案 0 :(得分:2)

此处的典型解决方案是将值括在引号中,至少在值包含字段分隔符时。

例如,您可以像这样格式化输入:

foo, "hi, I am a value with a comma", bar 

然后,当您加载数据时,可以在LOAD DATA INFILE语句中包含此内容:

FIELD TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'