【问题标题】:Load data from this file. (load as EXCEL or CSV)从此文件加载数据。 (加载为 EXCEL 或 CSV)
【发布时间】:2020-12-20 04:51:09
【问题描述】:
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) 删除 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

【问题讨论】:

  • 您使用的是 Oracle 还是 SQLite?
  • 是否必须使用 SQL*Loader 将 CSV 文件加载到 Oracle 数据库中?

标签: sql oracle sql-loader regexp-replace


【解决方案1】:

看看下面的例子。

控制文件:

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

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2020-06-11
    • 2019-01-31
    相关资源
    最近更新 更多