【问题标题】:FIELD TERMINATED BY in MySQL LOAD DATA INFILEMySQL LOAD DATA INFILE 中的字段终止于
【发布时间】:2018-03-25 20:01:08
【问题描述】:

我有一个函数可以为我提供有关在 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, Mr. ABC, 5th Street New York, 100, 12-12-17

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

故障语句可能如下所示。

orderNumber456, Mr. XYZ, 3rd Avenue, New Jersey, 100, 12-12-17

我可以提供什么 FIELD TERMINATOR 来避免这个问题?我知道没有办法完全防止这种情况,但我想问什么是最好的方法来使它不太可能发生。

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

更新:

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

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

{type:long, range: "LONG","INT", amount:100}

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

{type:long, range: ""LONG"",""INT"", amount: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

【问题讨论】:

    标签: java mysql csv


    【解决方案1】:

    这里的典型解决方案是用引号将值括起来,至少当值包含字段分隔符时。

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

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

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

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

    【讨论】:

    • 它还允许像x,"y""z""a",b 这样的内部值在内部有引号。 "" 表示该上下文中的文字引用。
    • 哦,这就是我正在寻找的东西。然而,这并不能解决整个问题。我也有这样的数据:“{key_type:long,range_type:\"LONG\",amount:abc}" 当我将它解析成csv时,这就是我得到的,“{key_type:long,range_type:"LONG ",amount:abc}" 所以SQL在LONG之后终止字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2012-10-05
    • 2010-11-17
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多