sqlldr导入csv如何去除单双引号

博客访问: 631488
博文数量: 201
博客积分: 2776
博客等级: 少校
技术积分: 2797
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
一、sqlldrSQL*Loader是随Oracle一起发布和安装的命令行工具,命令名称为sqlldr。该工具用于将外部文件数据导入ORACLE。
SQL*Loader在运行时,必须指定一个控制文件和一个数据文件,除了将数据输出到Oracle外,还可以输出其他文件,用以指示运行状态,包括:Log File:& 日志文件,用于输出运行过程中的消息日志。当运行失败时,&&&&&&&&& 可据此判断失败原因。Bad Files: 错误数据行。当数据文件中某一行数据导入失败,这行数据&&&&&&&&& 将被输出到BadFile中。
二、当以带有过滤条件方式运行SQL*Loader导入数据(数据过滤条件在控制文件中指定),SQL*Loader还会根据需要输出以下文件:Discard Files: 包含被过滤条件废弃的数据记录的文件。
SQL*Loader命令常用参数:> SQLLDR keyword=value [,keyword=value,...]userid:&& 用户名/口令,例如control:& 输入的控制文件名log:&&&&& 输出的日志文件名bad:&&&&& 输出的错误数据文件名data:&&&& 输入的数据文件名discard:& 输出的废弃数据文件名errors:&& 允许的错误数,如果错误记录超过该数目,程序立即退出slient:&& 运行过程隐藏消息
阅读(581) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&2838人阅读
Tom在EXPERT ONE ON ONE ORACLE中的数据装载一章详细介绍了SQLLDR的使用方法和技巧,其中也介绍了几种装载换行符的方法。
但是今天在ITPUB上看到一个帖子,是关于Tom介绍的那个例子的,仔细看了一下,Tom给出的例子和说明还存在一点小的问题。
首先来构建SQLLDR的例子,为了突出问题,将例子尽量简化:
SQL& CREATE TABLE TT (ID NUMBER, COMMENTS VARCHAR2(60));
表已创建。
控制文件的内容如下:
INTO TABLE TT
FIELDS TERMINATED BY ','
COMMENTS &REPLACE(:COMMENTS,'\n',CHR(10))&
10,This is the Sales\nOffice in Virginia
20,This is the Accounting\nOffice in Virginia
30,This is the Consulting\nOffice in Virginia
40,This is the Finance\nOffice in Virginia
使用SQLLDR导入数据,发现\n并没有被替换成换行:
SQL& HOST SQLLDR YANGTK/YANGTK CONTROL=E:\TEST.CTL
SQL& SELECT * FROM TT;
ID COMMENTS
---------- -----------------------------------------------------
10 This is the Sales\nOffice in Virginia
20 This is the Accounting\nOffice in Virginia
30 This is the Consulting\nOffice in Virginia
40 This is the Finance\nOffice in Virginia
但是,如果将\n都替换为/n,则导入结果正确:
INTO TABLE TT
FIELDS TERMINATED BY ','
COMMENTS &REPLACE(:COMMENTS,'/n',CHR(10))&
10,This is the Sales/nOffice in Virginia
20,This is the Accounting/nOffice in Virginia
30,This is the Consulting/nOffice in Virginia
40,This is the Finance/nOffice in Virginia
SQL& HOST SQLLDR YANGTK/YANGTK CONTROL=E:\TEST.CTL
SQL& SELECT * FROM TT;
ID COMMENTS
---------- --------------------------------------------------
10 This is the Sales
Office in Virginia
20 This is the Accounting
Office in Virginia
30 This is the Consulting
Office in Virginia
40 This is the Finance
Office in Virginia
而且测试发现,如果使用\n的话,只需要将REPLACE函数中的\n修改为\\n即可:
INTO TABLE TT
FIELDS TERMINATED BY ','
COMMENTS &REPLACE(:COMMENTS,'\\n',CHR(10))&
10,This is the Sales\nOffice in Virginia
20,This is the Accounting\nOffice in Virginia
30,This is the Consulting\nOffice in Virginia
40,This is the Finance\nOffice in Virginia
SQL& HOST SQLLDR YANGTK/YANGTK CONTROL=E:\TEST.CTL
SQL& SELECT * FROM TT;
ID COMMENTS
---------- --------------------------------------------
10 This is the Sales
Office in Virginia
20 This is the Accounting
Office in Virginia
30 This is the Consulting
Office in Virginia
40 This is the Finance
Office in Virginia
这是导入结果也是正确的,不过这就和Tom所说的有所偏差。根据Tom的观点,只有在UNIX环境下才需要使用\\n,而windows环境下\n是可以正常工作的。
但是通过测试却发现,无论是windows环境还是UNIX环境,都必须使用\\n才能得到正确的结果。Tom认为在UNIX环境下\n是换行标识,因此UNIX环境需要额外的\来标识。但是我怀疑问题不是操作系统环境造成的,而是C语言的语法造成的。
SQLLDR是Oracle最迅速的装载工具,这个工具是用C语言写的恐怕不是什么&#20540;得怀疑的事情。如果这个假设成立的话,那么问题产生的原因就很明显了。在控制文件中,COMMENTS列的&#26684;式控制部分是放在双引号中的:&REPLACE(:COMMENTS,'\n',CHR(10))&。也就是说,这部分SQLLDR是当作字符串读入的。根据C语言的性质,字符串中的’\’字符是转义符,也就是说这个’\n’被C语言解释成了换行符,因此REPLACE函数实际上变成了换行符替换为换行符的操作,这也是REPLACE操作没有生效的原因。在语言中为了处理转移符’\’,必须使用’\\’。这就是为什么\\n可以生效。
最后为了验证我的观点,对上面的控制文件进行简单的修改:
INTO TABLE TT
FIELDS TERMINATED BY ','
COMMENTS &REPLACE(REPLACE(:COMMENTS, ' ', CHR(10)), '\n', '!')&
10,This is the Sales\nOffice in Virginia
20,This is the Accounting\nOffice in Virginia
30,This is the Consulting\nOffice in Virginia
40,This is the Finance\nOffice in Virginia
SQL& HOST SQLLDR YANGTK/YANGTK CONTROL=E:\TEST.CTL
SQL& SELECT * FROM TT;
ID COMMENTS
---------- ------------------------------------------------------
10 This!is!the!Sales\nOffice!in!Virginia
20 This!is!the!Accounting\nOffice!in!Virginia
30 This!is!the!Consulting\nOffice!in!Virginia
40 This!is!the!Finance\nOffice!in!Virginia
果然不出所料。不过以Tom的功力应该是不会犯如此低级的错误的,而且我相信Tom也不大可能将没有测试过的例子直接写到书中。在Oracle的低版本测试中和我的测试有所出入亦未可知。我的测试版本是Oracle 10.2.0.1。
问题出自论坛的:。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:176460次
积分:2939
积分:2939
排名:第8517名
原创:99篇
转载:122篇
评论:12条
(1)(1)(2)(4)(5)(4)(2)(3)(4)(3)(1)(1)(5)(1)(4)(5)(3)(1)(7)(6)(7)(4)(11)(4)(3)(1)(3)(1)(4)(1)(9)(8)(6)(3)(3)(4)(13)(10)(9)(15)(11)(13)(3)(2)(6)(5)(2)请教sqlldr把多个格式一样的文件导入到一个表中
[问题点数:20分,结帖人shunan]
请教sqlldr把多个格式一样的文件导入到一个表中
[问题点数:20分,结帖人shunan]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2005年11月 扩充话题大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。oracle下的sqlldr命令使用方法(sqlldr工具的使用(批量导入数据))
oracle下的sqlldr命令使用方法(sqlldr工具的使用(批量导入数据))
sqlldr这个命令可以将文本中的数据 大批量的 导入到oracle数据库表中
在win7下使用很简单,自己亲自动手试了下,分享给大家
1.建立一个简单的文本文件,比如:testLoad.txt,内容如下:
1,&test&,33
2,&test&,33
3,&test&,33
4,&test&,33
5,&test&,33
6,&test&,33
7,&test&,33
8,&test&,33
9,&test&,33
10,&test&,33
2.在数据库中建立一个表,比如:
create table emp(
id number(5),
name varchar2(20),
age number(3),
constraint pk_id primary key(id));
3.建立一个简单的控制文件,比如:test.ctl,内容如下:
load data--控制文件标识 &
infile &#39;f:\testload.txt&#39;--要输入的数据文件名 &
into table test.emp--test为用户名,emp为表名--向哪个表追加记录
fields terminated by &#39;,&#39;--指定分割符,终止字段值&
4.打开cmdd命令行工具,sqlplus登录到相应的数据库,输入如下命令
sqlldr control=&#39;f:\test.ctl&#39; data=&#39;f:\testLoad.txt&#39;
执行结果显示 &记录数
5.如果想记录执行的过程和日志的话,可以这么写;
sqlldr control=&#39;f:\test.ctl&#39; data=&#39;f:\testLoad.txt&#39; log=&#39;f:\log.log&#39;
6. sqlldr用到的主要参数
1) & userid -- ORACLE username/password & --数据库 用户名/密码
2)control &控制文件
3) & log &记录的日志文件
4) & bad &坏数据文件,记录错误的未加载数据
5) & data &数据文件,* data参数只能指定一个数据文件,如果控制文件也通过infile指定了数据文件,并且指定多个,则sqlldr在执行时,先加载data参数指定的数据文件,控制文件中第一个infile指定的数据文件被忽略,但后续的infile指定的数据文件继续有效
6) & discard &丢弃的数据文件
7) & discardmax &允许丢弃数据的最大值 & & & &(默认全部)
8) & skip --跳过记录数,从数据文件中,从第一行开始要计算要跳过的行数 (默认0)
9) & load -- Number of logical records to load &(默认全部)
10) errors &允许的错误记录数,超过则终止任务(默认50)
11) rows -- Number of rows in conventional path bind array or between direct path data saves(每次提交的记录数,默认:常规路径64,直接路径全部,所以使用直接路径的话,效率会比普通的好太多太多)
12) bindsize -- Size of conventional path bind array in bytes(每次提交记录的缓冲区的大小,字节为单位,默认256000)
13) silent --禁止输出信息(header,feedback,errors,discards,partitions)
14) direct &使用直通路径方式导入(默认FALSE)
如果表中有索引的话,是不能指定direct=TRUE的,除非使用skip_index_maintenance=TRUE,这个就是在导入的时候忽略索引,所以在数据导入完毕以后,查看索引的状态应该都是无效的,需要重建之,如下SQL:select &* from dba_indexes where table_name=&#39;?&#39; ;
alter &idnex index_
重新建立索引要比新建索引快。
15) parallel --并行导入 (默认FALSE,注意:parallel并不是让一个sqlldr语句起多个进程来加载数据,而是不锁住加载表,允许别的直接路径加载.所以要使parallel起作用,应该先将要加载的数据文件分成多个,用多个sqlldr语句同时加载,如下例:
& sqlldr userid=scott/tiger control=load1.ctl data=data1.txt direct=y parallel=true & sqlldr userid=scott/tiger control=load2.ctl data=data2.txt direct=y parallel=true & sqlldr userid=scott/tiger control=load3.ctl data=data3.txt direct=y parallel=true &)
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 sqlldr 双引号 的文章

 

随机推荐