sql - 从此文件加载数据。(加载为 EXCEL 或 CSV)
问题描述
EmpId Name
----------------------
E0008 Mary _Jane
EMP0009 PeterParker
10 Jack roger
EMP 0012 Mark Todd
EMP0011 John Smith
EMP13 *Peter Parker
需要满足以下条件
从此文件加载数据(加载为 EXCEL 或 CSV)
加载数据时创建多个批次
加载数据时,应用以下规则
- (a) 删除 Name 列中多余的空格并替换为单个空格
- (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>
控制文件有什么作用?
For EMPID
: 因为它必须以 开头EMP
,所以它被设置为一个常数。输入数据中的数字用零填充,最多 4 个字符。
对于NAME
:
- 最里面的正则表达式
[^[:alnum:] ]
删除除字母数字和空格之外的任何内容 - 上一级正则表达式
'([[:upper:]])', ' \\1'
在每个大写字母前添加空格 - 再上一层正则表达式
' +', ' '
用一个空格替换多个空格 INITCAP
将每个单词的首字母大写TRIM
删除前导(和尾随)空格
推荐阅读
- xamarin - 如何在 AppCenter 中返回通知
- c# - 将复选框列表与接下来 7 天的日期值绑定
- sql - BigQuery 中的 ST_EXTENT 或 ST_ENVELOPE?
- linux - 容器无法访问其他容器端口
- php - 尝试使用explode从字符串中获取逗号之前的最低值
- indexing - 如何以 GPU 友好的方式获取 2D 张量中多个元素的索引?
- javascript - 使用 Typescript 声明了一个类型,但 Javascript 在内部使用了错误的类型
- python - 如果条件为真,则循环其他行
- r - 从具有不同数据结构的列表中返回函数结果。(使用 lapply 或 sapply 功能)
- java - 在 https://repo.maven.apache.org/maven2 中找不到 javax.sql:jdbc-stdext:jar:2.0 失败被缓存在本地仓库中,