从此文件加载数据 以EXCEL或CSV格式加载

问题描述

EmpId      Name
----------------------                                                                                 
E0008      Mary _Jane
EMP0009    PeterParker
10         Jack roger
EMP 0012   Mark Todd
EMP0011    John Smith
EMP13      *Peter Parker

需要满足以下条件

  1. 从此文件加载数据(以EXCEL或CSV格式加载)

  2. 在加载数据时会创建多个批次

  3. 在加载数据时,请遵循以下规则

    • (a)在“名称”列中删除多余的空格,并替换为单个空格
    • (b)在名字和姓氏之间没有空格的地方添加空格
    • (c)名称中,删除所有特殊字符
    • (d)名称中,更改为标题大小写
    • 在EmpID上,删除所有特殊字符,并且EmpID应采用EMP0011格式。

我的控制权在下面

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删除前导(和尾随)空格