Perl script 导出 DataStage jobs

来源:互联网 发布:数组作为函数形参 编辑:程序博客网 时间:2024/06/03 22:21
#!/usr/bin/perl
use strict;

my $USER_NAME = 'USER_NAME';
my $PASSWORD = 'PASSWORD';
my $DOMAIN = 'DOMAIN:PORT_NUMBER';
my $HOST_NAME = 'HOST_NAME';
my $PROJECT_NAME = 'PROJECT_NAME';
my $COMMAND ='C:/IBM/InformationServer/Clients/Classic/dsexport.exe'; # Path ofthe dsexport.exe tool

# Set the Inbound Main job name here
my $MAIN_JOB_NAME='MAIN_JOB_NAME';

# Set the Inbound Main job name here
my $DATA_TYPE_NAME='DATA_TYPE_NAME';

# Set the Data Type Dir
my $DATA_TYPE_DIR = 'DATA_TYPE_DIR';

# Set the Export Dir
my $EXPORT_DIR='D:/export';

my $SOURCE_FILE=$EXPORT_DIR.'/'.$MAIN_JOB_NAME;
my $OUTPUT_DIR=$EXPORT_DIR.'/'.$DATA_TYPE_DIR;
my $FORMAT_DIR = $OUTPUT_DIR.'/format';
my $PROCESS_DIR = $OUTPUT_DIR.'/process';
my $VALIDATION_DIR = $OUTPUT_DIR.'/validation';
my $TARGET_DIR=$OUTPUT_DIR;

my $targetPSName = 'ps'.$DATA_TYPE_NAME;
my $subJobName;
my $psName;
my $outputFileName;

my $isHeader = 0;
my $isJob = 0;
my $isParameterSet = 0;
my $isPSRecord = 0;
my $targetPSFound = 0;
my $isBelong = 0;

my $isAfterBeginJob = 0;
my $isAfterBeginDSRecord = 0;

my @headerBody;
my @jobBody;
my @parameterSetBody;

print "Deleting previous export ...\n";
&deldir($OUTPUT_DIR);
print "Previous export deleted.\n";
print "-------------------------------\n";
# Create export dir if not exist
print "Creating export directories...\n";
print "-------------------------------\n";


mkdir( $EXPORT_DIR, 0777 ) if ( !-d $EXPORT_DIR);
mkdir( $OUTPUT_DIR, 0777 ) if ( !-d $OUTPUT_DIR);
mkdir($FORMAT_DIR, 0777) if(! -d $FORMAT_DIR);
mkdir($PROCESS_DIR, 0777) if(! -d $PROCESS_DIR);
mkdir($VALIDATION_DIR, 0777) if(! -d $VALIDATION_DIR);

# Export the main job with dependent sub jobs
print "Exporting job: $MAIN_JOB_NAME ... \n";
my $output = `$COMMAND /D=$DOMAIN /H=$HOST_NAME /U=$USER_NAME/P=$PASSWORD /JOB=$MAIN_JOB_NAME $PROJECT_NAME$EXPORT_DIR/$MAIN_JOB_NAME`;

########################### Split the output into individual jobs#############################

print "\n\nSpliting individual jobs ... \n";
print "-------------------------------\n";
open(FH_MAINJOB, "<$SOURCE_FILE") || die "Unable toopen the file : $SOURCE_FILE<$!>";

sub deldir {
    my $dirtodel= pop;
    print"Deleting $dirtodel...\n";
    my $sep ='\\'; #change this line to "/" on linux.
    opendir(DIR,$dirtodel);
    my @files =readdir(DIR);
   closedir(DIR);

    @files =grep { !/^\.{1,2}/ } @files;
    @files = map{ $_ = "$dirtodel$sep$_"} @files;

    @files = map{ (-d $_)?deldir($_):unlink($_) } @files;

   rmdir($dirtodel);
}

while(<FH_MAINJOB>) {
    
    # ParsingHeader block
    if(/^BEGINHEADER/){
      push @headerBody, $_;
      $isHeader = 1;
      next;
    }
    if(/^ENDHEADER/){
      push @headerBody, $_;
      $isHeader = 0;
    }
    
    if($isHeader){
      if(/\s*CharacterSet "(CP936)"/){
         # Change character code if local is CP936
         s/CP936/CP1252/;
      }
      push @headerBody, $_;
      #print FH_HEADER;
    }
    
    # ParsingJob block
    if(/^BEGINDSJOB/){
      $isJob = 1;
      push @jobBody, $_;
      $isAfterBeginJob = 1;
      next;
    }
    if(/^ENDDSJOB/){
      push @jobBody, $_;
      $isJob = 0;
      # output job
      if($isBelong){
         open(FH_JOB, ">$outputFileName")|| die "Unable to open the file : $$outputFileName<$!>";
         foreach my $line (@headerBody){
            print FH_JOB $line;
         }
         foreach my $line (@jobBody){
            print FH_JOB $line;
         }
         close(FH_JOB);
      }
      # Clear previous job body
      @jobBody = ();
      $isBelong = 0;
    }
    
    if($isJob){
      if(/^\s*Category/&& /\\\\($DATA_TYPE_DIR)/){
         $isBelong = 1;
         my @matches = /\\\\([^\\^"]+)/g;

         print "Job: ".join("\\",@matches)."\\$subJobName\n";

         # Get the last folder name in category
         my $folderName = $matches[$#matches];

         print "Last folder is: $folderName.\n";
         if($folderName eq 'format'){
            $TARGET_DIR = $FORMAT_DIR;
         }
         elsif($folderName eq 'process'){
            $TARGET_DIR = $PROCESS_DIR;
         }
         elsif($folderName eq 'validation'){
            $TARGET_DIR = $VALIDATION_DIR;
         }
         else{
            $TARGET_DIR = $OUTPUT_DIR;
         }
         $outputFileName =$TARGET_DIR.'/'.$subJobName;

      }
      push @jobBody, $_;
      if($isAfterBeginJob == 1){
         if(/^\s*Identifier "(\w+)"$/){# Get jobname
            $subJobName =$1;    
         }
         $isAfterBeginJob = 0;
      }
    }

    # ParsingParameterSet block
    if(/^BEGINDSPARAMETERSETS/){
      $isParameterSet = 1;
      next;
    }
    if(/^ENDDSPARAMETERSETS/){
      $isParameterSet = 0;
    }
    
    if($isParameterSet){
      if(/^\s*BEGIN DSRECORD/){
         $isPSRecord = 1;
         push @parameterSetBody, $_;
         $isAfterBeginDSRecord = 1;
         next;
      }
      if(/^\s*END DSRECORD/){
         push @parameterSetBody, $_;
         $isPSRecord = 0;
         # output parameter set
         if ($targetPSFound == 1){
            open(FH_PS, ">$outputFileName") ||die "Unable to open the file : $$outputFileName<$!>";
            foreach my $line (@headerBody){
               print FH_PS $line;
            }
            print FH_PS "BEGIN DSPARAMETERSETS\n";
            foreach my $line (@parameterSetBody){
               print FH_PS $line;
            }
            print FH_PS "END DSPARAMETERSETS\n";
            close(FH_PS);
         }
         # Clear previous ParameterSet body
         @parameterSetBody = ();
      }
      if($isPSRecord){
         push @parameterSetBody, $_;
         if($isAfterBeginDSRecord == 1){
            # Find the target ParameterSet
            if(/^\s*Identifier "(\w+)"$/){# Get parameter setname
               $psName = $1;
               if($psName eq $targetPSName){
                  $targetPSFound = 1;
                  $outputFileName = $OUTPUT_DIR.'/'.$psName;
                  print $outputFileName."\n";
               }
            }
            $isAfterBeginDSRecord = 0;
         }
      }
    }

}
0 0
原创粉丝点击