sqlldr的控制文件中可以对某个列生成sequence(比如行号),如果你只有一段数据的话,那只要指定列frequency SEQUENCE(0,4)就能满足你的要求了;但是如果有多段数据,而且每段数据都要重新对frequency置零的话,那就只能写程序了。

解决方案 »

  1.   

    多谢KingSunSha, 频率的序列号问题基本解决了
    另一个问题是,数据文件里一行存放了 6个数据,两个数据之间用两个空格分开,
    另外数据开始和结束处都有一个‘-1’标识符,这必须先写程序做格式转换还是在控制文件里边就可以处理
      

  2.   

    我做了一个简单的测试,去掉前后的-1,文本test.dat如下
    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)结果成功倒入
      

  3.   

    不好意思,前面没说清楚,数据文件里每行的第一个数据前面也有两个空格
    刚才试过了,可以导入,只是数据不对
    另外一个数据文件包含多段数据,每段之间是以 ‘-1’ 开头结束,则前面的序列号是在
    控制文件里编程序吗
    还请 KingSunSha 大侠帮忙
      

  4.   

    其实sqlldr对数据文件的格式是比较挑剔的
    越工整越好,控制文件的编程功能并不强,不能处理复杂的数据格式。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导入到数据库表,不用我多说了吧?
      

  5.   

    对不起,我刚才没看清楚你的文件内容,所以刚才的程序结果不对。
    先更改如下
    #!/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
      

  6.   

    多谢ATCG,perl语言和c 语言哪个效率较高,perl好学吗
      

  7.   

    大体上C语言比PERL效率高,
    但PERL的效率也非常高,一般认为仅次于C语言PERL语言有自己的特色,它的正则表达式,它的字符串处理能力,它的哈希结构
    等特色是其它语言所不能比的,
    现在JAVA也有正则表达式,但JAVA的执行效率不如PERL还有PERL远比C语言好学,而且PERL程序还可以编译成C语言。我给你的例子,你只要执行一下就可以了
      

  8.   

    我执行了,结果出来了,谢谢ATCG 大侠
    perl语言有没有比较经典的书,我的数据文件比写出来的要复杂得多
      

  9.   

    若急用,你把格式贴出来,我可以帮你搞定。
    若不急用,自己去看书也可以。机工的《Perl 5 编程详解》还凑乎。
      

  10.   

    数据格式简化一下是这样的
        -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程序方便吗
    如果太麻烦,给个提示就可以了,谢谢
      

  11.   

    这么乱
    你需说明你的文本要做成什么样的格式
    我才可以帮你,不管你的文本怎么样,我都可以用PERL实现java调用PERL的.pl文件,好像不行,不会执行的,我试过的。
    如果用PERLCC把.PL编译成C语言,然后再用gcc编程成可执行程序,应该可以调用用C语言搞定你的文本当然是可以的,用JAVA也可以,
    不过PERL语言很简洁,比JAVA效率高,字符串处理能力很强,是它的特色!