【问题标题】:Load data from text file to DB将数据从文本文件加载到数据库
【发布时间】:2016-07-08 09:29:52
【问题描述】:

数据:

1|\N|"First\Line"
2|\N|"Second\Line"
3|100|\N

\N 在 MYSQL 和 MariaDB 中代表 NULL。 我正在尝试使用LOAD DATA LOCAL INFILE 方法将上述数据加载到名为 ID_OPR 的表中。

表结构:

CREATE TABLE ID_OPR (
  idnt decimal(4),
  age decimal(3),
  comment varchar(100)
);

我的代码如下所示:

LOAD DATA LOCAL INFILE <DATA FILE LOCATION> INTO TABLE <TABLE_NAME> FIELDS TERMINATED BY '|' ESCAPED BY '' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';

此代码的问题是它中止并出现错误Incorrect decimal value: '\\N' For column &lt;Column name&gt;

问题: 如何在第二个十进制列中使用NULL 值加载此数据,并且不会从第三个字符串列中丢失\(Backslash)

我正在尝试这是 MariaDB,它在大多数情况下类似于 Mysql。

更新: 我提到的错误看起来像一个警告,数据实际上正在加载到表中。但这里的问题在于文本数据。

例如:如果上面的第三条记录作为 \N 本身加载到字符串列中。但我希望它为 NULL。

有没有办法让软件识别这个空值?像 oracle 中的解码之类的东西?

【问题讨论】:

  • 十进制字段是否设置为接受空值?它是否默认设置为null?此外,您应该能够使用另一个反斜杠转义反斜杠:“First\\Line”
  • 是的,十进制字段可以接受空值 - 默认设置为空。不允许手动修改数据或使用代码。这些记录必须使用通用脚本进行处理。
  • 请从转储中发布几行真实的行
  • @e4c5:真实数据中没有比上面提供的数据。由于我无法将作品提取到公共网站,因此我将其屏蔽并以简单文本“First\Line”的形式提及。
  • FIrst\Line 没有意义。 \L 应该是什么意思?

标签: mysql mariadb


【解决方案1】:

你不能同时拥有它 - \ 是转义字符,或者不是。来自MySQL docs

如果FIELDS ESCAPED BY 字符为空,则不会转义任何字符,并且NULL 输出为NULL,而不是\N。指定一个空的转义字符可能不是一个好主意,尤其是当数据中的字段值包含刚刚给出的列表中的任何字符时。

所以,我建议使用格式一致的输入文件,但它是生成的:

  • 如果您想在字符串中保留反斜杠,请使用 \\
  • 在您的加载命令中将\ 设为转义字符

  • 使字符串始终用引号括起来,而不是可选地
  • 将转义字符留空,原样
  • NULL 用于空值,而不是\N

顺便说一句,这也解释了您在十进制字段中加载 \N 时遇到的警告。

【讨论】:

    【解决方案2】:

    用空格处理空值。这应该可以解决它。

    1||"First\Line"
    2||"Second\Line"
    3|100|
    

    这就是在 CSV 和 TSV 上处理空值的方式。并且不要期望 decimal 数据类型保持为 0 时变为 null,如果需要,请使用 int 或 bigint。你应该忘记“ESCAPED BY”;只要字符串数据由处理转义问题的“”括起来。

    【讨论】:

      【解决方案3】:

      我们需要三个文本文件和一个批处理文件来加载数据: 假设您的文件位置为 'D:\loaddata' 您的文本文件 'D:\loaddata\abc.txt'
      1. D:\loaddata\abc.bad -- 空
      2. D:\loaddata\abc.log -- 空
      3. D:\loaddata\abc.ctl
      一个。在下面写代码,没有分隔符

      OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000) 
      load data 
      infile 'D:\loaddata\abc.txt' 
      TRUNCATE
      into table Your_table
      (
       a_column          POSITION   (1:7) char,
       b_column          POSITION   (8:10) char,
       c_column          POSITION   (11:12) char,
       d_column          POSITION   (13:13) char,
       f_column          POSITION   (14:20) char
      )
      

      b.为逗号分隔符在下面编写代码

      OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000) 
      load data 
      infile 'D:\loaddata\abc.txt' 
      TRUNCATE
      into table Your_table
      FIELDS TERMINATED BY ","
      TRAILING NULLCOLS
      (a_column,
       b_column,
       c_column,
       d_column,
       e_column,
       f_column
       )
      

      4.D:\loaddata\abc.bat "在下面写代码"

      sqlldr db_user/db_passward@your_tns control=D:\loaddata\abc.ctl log=D:\loaddata\abc.log
      

      双击“D:\loaddata\abc.bat”文件后,您的数据将被加载期望的oracle表。如果有任何问题,请检查“D:\loaddata\abc.bad”和“D:\loaddata\abc.log”文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2021-01-11
        • 2015-07-29
        相关资源
        最近更新 更多