使用sqlldr导入txt数据

将txt或者csv数据导入数据库最方便的方法就是使用sqlldr,使用sqlldr必须有一个控制文件,控制文件能把外部数据和数据库的表和列联系起来。

新建数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE "TENVAIR"."TEST"
("EMISS_GRIDID" NUMBER(*,0) NOT NULL ENABLE,
"X" NUMBER(*,0) NOT NULL ENABLE,
"Y" NUMBER(*,0) NOT NULL ENABLE,
"EMISS_TYPE" VARCHAR2(16) NOT NULL ENABLE,
"POLLUTION_TYPE" VARCHAR2(16) NOT NULL ENABLE,
"JAN" NUMBER(20,10),
"FEB" NUMBER(20,10),
"MAR" NUMBER(20,10),
"APR" NUMBER(20,10),
"MAY" NUMBER(20,10),
"JUN" NUMBER(20,10),
"JUL" NUMBER(20,10),
"AUG" NUMBER(20,10),
"SEP" NUMBER(20,10),
"OCT" NUMBER(20,10),
"NOV" NUMBER(20,10),
"DEC" NUMBER(20,10),
"TOTAL" NUMBER(20,10));

数据格式

1
2
3
4
5
EMISS_GRIDID,X,Y,EMISS_TYPE,POLLUTION_TYPE,JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,TOTAL
10398,158,33,agriculture,NH3,,,,,,,,,,,,,57.5565528870
10398,158,33,industry,ALD2,,,,,,,,,,,,,0.0081295827
10398,158,33,industry,ALDX,,,,,,,,,,,,,0.0782553777
10398,158,33,industry,BC,,,,,,,,,,,,,2.5780515671

编写控制文件t.ctl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
load data
append into table TENVAIR.TEST
fields terminated by ','
TRAILING NULLCOLS
(
EMISS_GRIDID,
X,
Y,
EMISS_TYPE,
POLLUTION_TYPE,
JAN,
FEB,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC,
TOTAL)

infile ‘EMISS_MEIC.txt’ 表示要导入的文本名为EMISS_MEIC.txt,也可以在执行sqlldr的时候加data=EMISS_MEIC.txt
append/insert/replace/truncate into table TABLE_NAME append表示使用追加的方式将数据写入表中;insert 表示导入空表,有数据则停止;replace表示原来表中如果有数据,则会被删除(用delete from table语句);truncate表示原来表中如果有数据,则会被清除(用truncate table语句)
fields terminated by ‘,’ 数据中每行记录用”,”分隔
TRAILING NULLCOLS 表的字段没有对应的值时允许为空

使用sqlldr导入

如果数据文件是从windows传到linux操作系统上的,需要转换一下文件格式
dos2unix EMISS_MEIC.txt
sqlldr userid=user/'passwd' control=t.ctl data=EMISS_MEIC.txt readsize=4194304

查看导入结果

从日志文件中我们可以看到导入详情,导入1279319条数据,耗时33秒,效率还是非常高的!
sqlldr
sqlldr

独学无友,孤陋寡闻;学习记录,欢迎拍砖!