问题描述
EmpId Name
----------------------
E0008 Mary _Jane
EMP0009 PeterParker
10 Jack roger
EMP 0012 Mark Todd
EMP0011 John Smith
EMP13 *Peter Parker
需要满足以下条件
-
从此文件加载数据(以EXCEL或CSV格式加载)
-
在加载数据时会创建多个批次
-
在加载数据时,请遵循以下规则
我的控制权在下面
load data
infile 'E:\A\Book2.csv'
TruncATE
PRESERVE BLANKS
into table dummy
fields terminated by ','
optionally enclosed by '"'AND'"'
(
EMPID "CASE WHEN SUBSTR(:EMPID,1,1)='E' THEN 'EMP00'||SUBSTR(:EMPID,-2) ELSE
'EMP00'||SUBSTR(:EMPID,-2) END",NAME "INITCAP(REGEXP_REPLACE(:NAME,'[^A-Z a-z]'))"
)
我无法满足条件2、3b,3d
解决方法
看看下面的例子。
控制文件:
load data
infile *
replace
into table dummy
fields terminated by ";"
trailing nullcols
(
empid "'EMP' || lpad(regexp_substr(:empid,'[[:digit:]]+$'),4,'0')",name "trim(initcap(regexp_replace(regexp_replace(regexp_replace(:name,'[^[:alnum:] ]'),'([[:upper:]])',' \\1'),' +',' ')))"
)
begindata
E0008;Mary _Jane
EMP0009;PeterParker
10;Jack roger
EMP 0012;Mark Todd
EMP0011;John Smith
EMP13;*Peter Parker
加载会话和结果:
SQL> $sqlldr scott/tiger@kc11gt control=test32.ctl log=test32.log
SQL*Loader: Release 11.2.0.1.0 - Production on Uto Ruj 1 10:18:01 2020
Copyright (c) 1982,2009,Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 5
Commit point reached - logical record count 6
SQL> select * from dummy;
EMPID NAME
---------- --------------------
EMP0008 Mary Jane
EMP0009 Peter Parker
EMP0010 Jack Roger
EMP0012 Mark Todd
EMP0011 John Smith
EMP0013 Peter Parker
6 rows selected.
SQL>
控制文件有什么作用?
对于EMPID
:由于它必须以EMP
开头,因此将其设置为常量。输入数据中的数字将以零填充,最长为4个字符。
对于NAME
:
- 最里面的正则表达式
[^[:alnum:] ]
除去字母数字和空格之外的所有内容 - 一级正则表达式
'([[:upper:]])',' \\1'
在每个大写字母前添加空格 - 再一层正则表达式
' +',' '
用一个空格替换多个空格 -
INITCAP
每个单词的首字母大写 -
TRIM
删除前导(和尾随)空格