在对数据文件进行导入的时候,可能会遇到文件比较特殊的情况(实验所用表还是上篇文章的FRUITMARKET)
1. 如果要导入的文件中包含双引号
1,Apple,¥4.00,"A_3"
2,Pear,¥3.00,"B_2"
3,Grape,¥6.00,"C_5"
4,Banana,¥6.00,"D_2"
fruit2.dat
如果不想再数据库中存放这些双引号,就要加入OPTIONALLY ENCLOSED BY ' " ' 语句
编写控制文件
LOAD DATA INFILE fruit2.dat TRUNCATE INTO TABLE FRUITMARKET FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' (FID,FNAME,PRICE,ADDRESS)
fruit2.ctl
执行SQLLDR命令SQLLDR SCOTT/tiger CONTROL=fruit2.ctl
(不知道怎么回事在10g中¥符号不能被正常识别,这问题以后再说,大家可以注意一下数据文件中的双引号已经被过滤掉了)
2. 导入的数据文件没有明显的分隔符
1 Apple ¥3.00 A_3 2 Pear ¥2.00 B_2 3 Grape ¥4.00 C_5 4 Banana ¥6.00 D_2
fruit3.dat
编写控制文件
LOAD DATA INFILE fruit3.dat TRUNCATE INTO TABLE FRUITMARKET ( FID position(1), FNAME position(7:12), PRICE position(17:21), ADDRESS position(28:32) )
fruit3.ctl
这里position的位置是告诉SQLLDR,从哪到哪是一个字段,也就是指出字段的开始和结束位置,比较麻烦的就是还要数出空格的数量
结果:
也可以在position语句中使用*,将上述的控制文件等价代换
LOAD DATA INFILE fruit3.dat TRUNCATE INTO TABLE FRUITMARKET ( FID position(1), FNAME position(*+5:12), PRICE position(*+4:21), ADDRESS position(*+6:32) )
*代表了上一个字段的结束位置加一,比如第二行的*就代表了1+1=2,也就是 2+5:12
3.还是这个例子,如果要将fruit的数据导入fruitmarket表中的时候还不知道fruit的address怎么办
1 Apple $3.00 2 Pear $2.00 3 Grape $4.00 4 Banana $6.00
编写控制文件
LOAD DATA INFILE fruit4.dat TRUNCATE INTO TABLE FRUITMARKET ( FID position(1), FNAME position(7:12), PRICE position(17:21), ADDRESS "NULL" )
此时可以暂时将ADDRESS值设为NULL,在这个位置0也是允许的值,不过在这里ADDRESS设为0会有点奇怪
结果:
4. 如果数据文件中有多余数据的情况
1 Apple $3.00 zhangsan A_3 2 Pear $2.00 lisi B_2 3 Grape $4.00 zhangsan C_5 4 Banana $6.00 lisi D_2
(在编辑器中后面的字符没法对齐,但是正式导入的时候最好要对齐,否则会加大工作量)
fruit5.dat
编写控制文件:
LOAD DATA INFILE fruit5.dat TRUNCATE INTO TABLE FRUITMARKET ( FID position(1), FNAME position(7:12), PRICE position(17:21), ADDRESS position(39:41) )
只要这样指定字段的长度就可以了
还有要注意一点就是如果在有分隔符的情况下存在多余的数据
1,Apple,$3.00,zhangsan, A_3 2,Pear,$2.00,lisi,B_2 3,Grape,$4.00,zhangsan,C_5 4,Banana,$6.00,lisi,D_2
那么就要修改控制文件
LOAD DATA INFILE fruit5.dat TRUNCATE INTO TABLE FRUITMARKET FIELDS TERMINATED BY "," ( FID,FNAME,PRICE,FILLER,ADDRESS )
用FILLER关键字来过滤掉不需要的字段