sqlldr问题,想了一星期还是不会 sqlldr的控制文件中可以对某个列生成sequence(比如行号),如果你只有一段数据的话,那只要指定列frequency SEQUENCE(0,4)就能满足你的要求了;但是如果有多段数据,而且每段数据都要重新对frequency置零的话,那就只能写程序了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多谢KingSunSha, 频率的序列号问题基本解决了另一个问题是,数据文件里一行存放了 6个数据,两个数据之间用两个空格分开,另外数据开始和结束处都有一个‘-1’标识符,这必须先写程序做格式转换还是在控制文件里边就可以处理 我做了一个简单的测试,去掉前后的-1,文本test.dat如下1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-071.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05控制文件test.ctl如下:load datainfile 'C:\test.dat' "fix 13"badfile 'C:\test.bad'discardfile 'C:\test.dsc'appendinto table "TMP_TEST"FIELDS TERMINATED BY WHITESPACE(VALUE)结果成功倒入 不好意思,前面没说清楚,数据文件里每行的第一个数据前面也有两个空格刚才试过了,可以导入,只是数据不对另外一个数据文件包含多段数据,每段之间是以 ‘-1’ 开头结束,则前面的序列号是在控制文件里编程序吗还请 KingSunSha 大侠帮忙 其实sqlldr对数据文件的格式是比较挑剔的越工整越好,控制文件的编程功能并不强,不能处理复杂的数据格式。sqlldr侧重的功能是将数据导入数据库表,而不是对文本数据进行预处理sqlldr总是假设文本文件非常的对它的胃口。所以我碰到此类问题,也懒得花时间去研究怎么写控制文件即使用控制文件解决,导入的速度也会大打折扣,这一点我是深有体会的因此,说了这么多的废话建议对文本文件进行预处理给你一个解决方案步骤:1、去下载一个Perl5.6 http://www.activeperl.com/Products/Download/Download.plex?id=ActivePerl 选择5.6版本的MSI 8.6M2、安装Perl5.6(很方便的,1、2分的事情)3、编写一个简单的Perl的程序,由我代劳吧,程序名为test.pl 程序代码如下:#!/usr/bin/perlopen(FILE_IN,"$ARGV[0]");open(FILE_OUT,">$ARGV[1]");my $count=0;while(<FILE_IN>) { chomp; if ($_!~m/\-1|-1/) { $row_data=$_; $row_data=~s/^\s+|\s+$//g; @split_line=split(/\s+/,$_); foreach $ele(@split_line) { print FILE_OUT $count."\t".$ele."\n"; $count=$count+4; } } }close(FILE_IN);close(FILE_OUT);4、执行命令 perl test.pl 输入文件名 输出文件名 输入文件就是你的数据文件,假设是test.dat -1 1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07 1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05 -1 1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07 1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05 -1 不过我不知道你的那个是 -1 还是 -1 这非常重要,不过我在程序里已经做了处理,不管是 -1 还是 -1 都不要 输出文件名任取,已test.out为例 perl test.pl test.dat test.out 参数必须完整,输出文件test.out将会是如下格式0 1.06335E-064 1.41626E-068 1.94109E-0612 3.38321E-0616 6.78082E-0620 1.75458E-0524 1.06335E-0628 1.41626E-0632 1.94109E-0636 3.38321E-0640 6.78082E-0644 1.75458E-05行首和行末均没有空白符号5、把输出文件用sqlldr导入到数据库表,不用我多说了吧? 对不起,我刚才没看清楚你的文件内容,所以刚才的程序结果不对。先更改如下#!/usr/bin/perlopen(FILE_IN,"$ARGV[0]");open(FILE_OUT,">$ARGV[1]");my $count=0;while(<FILE_IN>) { chomp; if ($_!~m/^\s*\-1|^\s*-1/) { $row_data=$_; $row_data=~s/^\s+|\s+$//g; @split_line=split(/\s+/,$_); foreach $ele(@split_line) { print FILE_OUT $count."\t".$ele."\n"; $count=$count+4; } } }close(FILE_IN);close(FILE_OUT);得到新的test.out0 1.57869E-164 7.34452E-078 6.38861E-0712 6.30110E-0716 8.41587E-0720 8.25447E-0724 1.06335E-0628 1.41626E-0632 1.94109E-0636 3.38321E-0640 6.78082E-0644 1.75458E-0548 1.57869E-1652 7.34452E-0756 6.38861E-0760 6.30110E-0764 8.41587E-0768 8.25447E-0772 1.06335E-0676 1.41626E-0680 1.94109E-0684 3.38321E-0688 6.78082E-0692 1.75458E-05 多谢ATCG,perl语言和c 语言哪个效率较高,perl好学吗 大体上C语言比PERL效率高,但PERL的效率也非常高,一般认为仅次于C语言PERL语言有自己的特色,它的正则表达式,它的字符串处理能力,它的哈希结构等特色是其它语言所不能比的,现在JAVA也有正则表达式,但JAVA的执行效率不如PERL还有PERL远比C语言好学,而且PERL程序还可以编译成C语言。我给你的例子,你只要执行一下就可以了 我执行了,结果出来了,谢谢ATCG 大侠perl语言有没有比较经典的书,我的数据文件比写出来的要复杂得多 若急用,你把格式贴出来,我可以帮你搞定。若不急用,自己去看书也可以。机工的《Perl 5 编程详解》还凑乎。 数据格式简化一下是这样的 -1 151XXX XXX-noise n XXX test i_ana 15-MAY-102 19: 2:4715-MAY-102 19: 2:47ISDB : Version 1.00 29-MAY-102 15:39: 1 -1 -1 164 1 Metric ABS (SI) 1.00000000000000000D+00 1.00000000000000000D+00 1.00000000000000000D+00 2.73149999999999977D+02 -1 -1 58NONE NONE 15-MAY-10223: 2:25 NONE NONE 9 1 1 0 a1x 1 1 0 0 2 2048 1 0.00000E+00 4.00000E+00 1.00000E+00 18 0 0 0 NONE Hz 0 0 0 0 NONE (g)**2/Hz 0 0 0 0 NONE NONE 0 0 0 0 NONE NONE 1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07 1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05 1.60159E-04 1.73167E-04 2.15117E-05 9.21258E-06 7.20801E-06 4.94639E-06 9.30915E-08 1.53957E-07 1.29511E-07 1.01410E-07 7.09756E-08 1.08604E-07 1.48441E-07 1.10872E-07 -1这个文件可能很难看懂,基本格式是两个‘-1’ 之间对应一段数据,每段数据 格式又不一样,我的想法是依次两个‘-1’之间的数据存到一个文件里,然后执行入库程序,现在用perl 怎样把‘-1’之间的数据存到文件里,有多少个数据段不确定,所以输出文件组可以在程序里边确定另外在Java 里边调用perl程序方便吗如果太麻烦,给个提示就可以了,谢谢 这么乱你需说明你的文本要做成什么样的格式我才可以帮你,不管你的文本怎么样,我都可以用PERL实现java调用PERL的.pl文件,好像不行,不会执行的,我试过的。如果用PERLCC把.PL编译成C语言,然后再用gcc编程成可执行程序,应该可以调用用C语言搞定你的文本当然是可以的,用JAVA也可以,不过PERL语言很简洁,比JAVA效率高,字符串处理能力很强,是它的特色! oracle更新, 大量数据 如果使用RMAN备份在其他机器上进行数据库恢复(两台机器的目录不一致)? 各位大侠,小弟的困扰很久了,这条语句怎么写呢 如何确定一张表中的主键与外键?!急! 不能登录到Oracle Management Server ORA-04031 错误! 请教一个 sql的统计,有点难?? 不停应用情况下,可以把数据库中某个表的某个字段修改为可空吗? 列出總分成績(Oracle) 【急】此处不允许序号? 事务处理,如何得知语句执行情况! 有没有办法在没有网卡的计算机上启动TNS
另一个问题是,数据文件里一行存放了 6个数据,两个数据之间用两个空格分开,
另外数据开始和结束处都有一个‘-1’标识符,这必须先写程序做格式转换还是在控制文件里边就可以处理
1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07
1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05控制文件test.ctl如下:load data
infile 'C:\test.dat' "fix 13"
badfile 'C:\test.bad'
discardfile 'C:\test.dsc'append
into table "TMP_TEST"FIELDS TERMINATED BY WHITESPACE
(VALUE)结果成功倒入
刚才试过了,可以导入,只是数据不对
另外一个数据文件包含多段数据,每段之间是以 ‘-1’ 开头结束,则前面的序列号是在
控制文件里编程序吗
还请 KingSunSha 大侠帮忙
越工整越好,控制文件的编程功能并不强,不能处理复杂的数据格式。sqlldr侧重的功能是将数据导入数据库表,而不是对文本数据进行预处理
sqlldr总是假设文本文件非常的对它的胃口。所以我碰到此类问题,也懒得花时间去研究怎么写控制文件
即使用控制文件解决,导入的速度也会大打折扣,这一点我是深有体会的因此,说了这么多的废话
建议对文本文件进行预处理
给你一个解决方案
步骤:
1、去下载一个Perl5.6
http://www.activeperl.com/Products/Download/Download.plex?id=ActivePerl
选择5.6版本的MSI 8.6M
2、安装Perl5.6(很方便的,1、2分的事情)
3、编写一个简单的Perl的程序,由我代劳吧,程序名为test.pl
程序代码如下:
#!/usr/bin/perl
open(FILE_IN,"$ARGV[0]");
open(FILE_OUT,">$ARGV[1]");
my $count=0;
while(<FILE_IN>)
{
chomp;
if ($_!~m/\-1|-1/)
{
$row_data=$_;
$row_data=~s/^\s+|\s+$//g;
@split_line=split(/\s+/,$_);
foreach $ele(@split_line)
{
print FILE_OUT $count."\t".$ele."\n";
$count=$count+4;
}
}
}
close(FILE_IN);
close(FILE_OUT);4、执行命令
perl test.pl 输入文件名 输出文件名
输入文件就是你的数据文件,假设是test.dat -1
1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07
1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05
-1
1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07
1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05
-1 不过我不知道你的那个是 -1 还是 -1
这非常重要,不过我在程序里已经做了处理,不管是 -1 还是 -1 都不要 输出文件名任取,已test.out为例 perl test.pl test.dat test.out 参数必须完整,输出文件test.out将会是如下格式
0 1.06335E-06
4 1.41626E-06
8 1.94109E-06
12 3.38321E-06
16 6.78082E-06
20 1.75458E-05
24 1.06335E-06
28 1.41626E-06
32 1.94109E-06
36 3.38321E-06
40 6.78082E-06
44 1.75458E-05行首和行末均没有空白符号5、把输出文件用sqlldr导入到数据库表,不用我多说了吧?
先更改如下
#!/usr/bin/perl
open(FILE_IN,"$ARGV[0]");
open(FILE_OUT,">$ARGV[1]");
my $count=0;
while(<FILE_IN>)
{
chomp;
if ($_!~m/^\s*\-1|^\s*-1/)
{
$row_data=$_;
$row_data=~s/^\s+|\s+$//g;
@split_line=split(/\s+/,$_);
foreach $ele(@split_line)
{
print FILE_OUT $count."\t".$ele."\n";
$count=$count+4;
}
}
}
close(FILE_IN);
close(FILE_OUT);
得到新的test.out
0 1.57869E-16
4 7.34452E-07
8 6.38861E-07
12 6.30110E-07
16 8.41587E-07
20 8.25447E-07
24 1.06335E-06
28 1.41626E-06
32 1.94109E-06
36 3.38321E-06
40 6.78082E-06
44 1.75458E-05
48 1.57869E-16
52 7.34452E-07
56 6.38861E-07
60 6.30110E-07
64 8.41587E-07
68 8.25447E-07
72 1.06335E-06
76 1.41626E-06
80 1.94109E-06
84 3.38321E-06
88 6.78082E-06
92 1.75458E-05
但PERL的效率也非常高,一般认为仅次于C语言PERL语言有自己的特色,它的正则表达式,它的字符串处理能力,它的哈希结构
等特色是其它语言所不能比的,
现在JAVA也有正则表达式,但JAVA的执行效率不如PERL还有PERL远比C语言好学,而且PERL程序还可以编译成C语言。我给你的例子,你只要执行一下就可以了
perl语言有没有比较经典的书,我的数据文件比写出来的要复杂得多
若不急用,自己去看书也可以。机工的《Perl 5 编程详解》还凑乎。
-1
151
XXX XXX-noise
n XXX test
i_ana
15-MAY-102 19: 2:47
15-MAY-102 19: 2:47
ISDB : Version 1.00
29-MAY-102 15:39: 1
-1
-1
164
1 Metric ABS (SI)
1.00000000000000000D+00 1.00000000000000000D+00 1.00000000000000000D+00
2.73149999999999977D+02
-1
-1
58
NONE
NONE
15-MAY-10223: 2:25
NONE
NONE
9 1 1 0 a1x 1 1 0 0
2 2048 1 0.00000E+00 4.00000E+00 1.00000E+00
18 0 0 0 NONE Hz
0 0 0 0 NONE (g)**2/Hz
0 0 0 0 NONE NONE
0 0 0 0 NONE NONE
1.57869E-16 7.34452E-07 6.38861E-07 6.30110E-07 8.41587E-07 8.25447E-07
1.06335E-06 1.41626E-06 1.94109E-06 3.38321E-06 6.78082E-06 1.75458E-05
1.60159E-04 1.73167E-04 2.15117E-05 9.21258E-06 7.20801E-06 4.94639E-06
9.30915E-08 1.53957E-07 1.29511E-07 1.01410E-07 7.09756E-08 1.08604E-07
1.48441E-07 1.10872E-07
-1这个文件可能很难看懂,基本格式是两个‘-1’ 之间对应一段数据,
每段数据 格式又不一样,我的想法是依次两个‘-1’之间的数据存到一个文件里,
然后执行入库程序,现在用perl 怎样把‘-1’之间的数据存到文件里,有多少个数据段
不确定,所以输出文件组可以在程序里边确定
另外在Java 里边调用perl程序方便吗
如果太麻烦,给个提示就可以了,谢谢
你需说明你的文本要做成什么样的格式
我才可以帮你,不管你的文本怎么样,我都可以用PERL实现java调用PERL的.pl文件,好像不行,不会执行的,我试过的。
如果用PERLCC把.PL编译成C语言,然后再用gcc编程成可执行程序,应该可以调用用C语言搞定你的文本当然是可以的,用JAVA也可以,
不过PERL语言很简洁,比JAVA效率高,字符串处理能力很强,是它的特色!