0

複数行の一連のレコードを含むファイルがあります。一連のレコードのログ ファイルを読み取り、それぞれの個別のレコードを個別のファイルに書き込む必要があります。以下と同じファイル..

VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v// CYX sss eee
VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v
v//
VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v
v//
v/*
and so on ...

したがって、上記の開始点から「VMEMBER NAME」はわかりますが、終了点はわかりません。「V」または「V//」などで終了できます。以下のように範囲一致で試しました

$line =~ m{VMEMBER .. v\/\*}

しかし、問題は最後のパターン (v*) です。これは、レコードの最後の行が何であるかがわからないためです。助けてください。

最初のセットの出力は

VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v// CYX sss eee

2番目のセットは

VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v
v//

このような。

4

4 に答える 4

3

このプログラムは、あなたが求めるようにします。コマンドラインのパラメーターとして入力ファイルへのパスを期待し、ファイルなどをファイルの最後まで生成File_001.txtFile_002.txtます。sprintf出力ファイル名を変更する場合は、使用する形式を変更できます。

use strict;
use warnings;
use autodie;

my $outfh;
my $n;

while (<>) {
  if (/^VMEMBER/) {
    my $file = sprintf "File_%03d.txt", ++$n;
    open $outfh, '>', $file;
  }
  print $outfh $_ if $outfh;
}

close $outfh if $outfh;
于 2013-10-14T17:36:24.777 に答える
2

ここにそれを行う1つの方法があります。

use strict;
use warnings; 

my %hash;
my $counter = 0;
my $group;

open my $fh, '<', 'data1.txt' # <-- The path to your file comes here!.
    or die "can't open data1.txt $1";

while (my $line = <$fh>) {
    if ($line =~ /^VMEMBER/) {
    $group = 'Group Number: ' . $counter++;
    }
    push @{ $hash{ $group } }, $line;
}

#By this point in the script all of your record have been separated in different set.
#As you can see in the output below.  

foreach my $group (sort keys %hash) {
    print "$group\n", @{ $hash{ $group } }, "\n";
} 

出力

Group Number: 0
VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v// CYX sss eee

Group Number: 1
VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v
v//

Group Number: 2
VMEMBER NAME  CMPJFCB                                                            
V//NGJFCB   JOB (P,KBTB,BB2994),'MVSNBY-CMP',CLASS=A,                    JOB40337
V//           REGION=0M,MSGCLASS=W,NOTIFY=&SYSUID    
v
v//
v/*
于 2013-10-14T16:54:22.877 に答える
0

これが私の見解であり、私にとってはうまく機能しています...

open (FILE, "abc.txt" ) || die "can't open file!";

my $reset=0;
my $SD=1;
while (<FILE>) {

if ( m/VMEMBER NAME/){
   if($reset != 0)
   {
    close OUT;
    }
    open(OUT, ">JOBS_$SD.txt") || die ("File could not found! $i");

    $SD++;
    $reset=1;
   }

print OUT $_;   

}
于 2013-10-14T17:09:01.133 に答える