将数据从文本文件加载到数据库

Load data from text file to DB

数据:

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

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

的 table 中

Table结构:

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 <Column name> 而中止。

问题: 如何使用第二个小数列中的 NULL 值加载此数据,同时又不丢失第三个字符串列中的 \(Backslash)

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

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

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

有什么办法可以让软件识别这个空值吗?像在 oracle 中解码?

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

If the FIELDS ESCAPED BY character is empty, no characters are escaped and NULL is output as NULL, not \N. It is probably not a good idea to specify an empty escape character, particularly if field values in your data contain any of the characters in the list just given.

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

  • 如果要在字符串中保留反斜杠,请使用 \
  • 在加载命令中使 \ 成为转义字符

  • 使字符串始终(非可选)括在引号中
  • 将转义字符留空,原样
  • 对空值使用 NULL,而不是 \N

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

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

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

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

我们需要三个文本文件和 1 个批处理文件来加载数据: 假设你的文件位置'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 "Write Code Below"

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

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