2

I've got a script that reformats an input file and creates an output file. When I try to read that output file for the second part of the script, it doesn't work. However if I split the script into two parts it works fine and gives me the output that I need. I'm not a programmer and surprised I've got this far - I've been banging my head for days trying to resolve this.

My command for running it is this (BTW the temp.txt was just a brute force workaround for getting rid of the final comma to get my final output file - couldn't find another solution):

c:\perl\bin\perl merge.pl F146.sel temp.txt F146H.txt

Input looks like this (from another software package) ("F146.sel"):

/ Selected holes from the .\Mag_F146_Trimmed.gdb database.
"L12260"
"L12270"
"L12280"
"L12290"

Output looks like this (mods to the text: quotes removed, insert comma, concatenate into one line, remove the last comma) "F146H.txt":

L12260,L12270,L12280,L12290 

Then I want to use this as input in the next part of the script, which basically inserts this output into a line of code that I can use in another software package (my "merge.gs" file). This is the output that I get if I split my script into two parts, but it just gives me a blank if I do it as one (see below).

CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="L12260,L12270,L12280,L12290"
GX             mergline.gx

What follows is my "merge.pl". What have I done wrong?

(actually, the question could be - what haven't I done wrong, as this is probably the most retarded code you've seen in a while. In fact, I bet some of you could get this entire operation done in 10-15 lines of code, instead of my butchered 90. Thanks in advance.)

# this reformats the SEL file to remove the first line and replace the " with nothing

$file = shift ;
$temp = shift ;
$linesH = shift ;

#open (Profiles, ">.\\scripts\\P2.gs")||die "couldn't open output .gs file";

open my $in,  '<', $file      or die "Can't read old file: Inappropriate I/O control operation";
open my $out, '>', $temp or die "Can't write new file: Inappropriate I/O control operation"; 

my $firstLine = 1;                                                                               

while( <$in> )                                                                                   
{                                                                                                
    if($firstLine)                                                                               
    {                                                                                            
        $firstLine = 0;                                                                          
    }                                                                                            
    else{                                                                                        
   s/"L/L/g; # replace "L with L                                                                 
   s/"/,/g; # replace " with, 
   s|\s+||; # concatenates it all into one line 
   print $out $_;  
    }
} 
close $out;


open (part1, "${temp}")||die "Couldn't open selection file";
open (part2, ">${linesH}")||die "Couldn't open selection file";
printitChomp();

sub printitChomp
{
print part2 <<ENDGS;
ENDGS
}

while ($temp = <part1> )
{
    print $temp;    
    printit();
}

sub printit 
{$string = substr (${temp}, 0,-1);
print part2 <<ENDGS;
$string
ENDGS
}                                                                                      

####Theoretically this creates the merge script from the output 
####file from the previous loop. However it only seems to work 
####if I split this into 2 perl scripts.
open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";
printitMerge();

open (SEL, "${linesH}")||die "Couldn't open selection file";  
sub printitMerge
#open .sel file                                                 

{
print MergeScript <<ENDGS;
ENDGS
}

#iterate over required files
while ( $line = <SEL> ){    
    chomp $line;            
    print STDOUT $line;     
    printitLines();              

}                           

sub printitLines 
{
print MergeScript <<ENDGS;
CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="${line}"
GX             mergline.gx

ENDGS
}

1 Answer 1

1

so I think all you were really missing was close(part2); to allow it to be reopened as SEL..

#!/usr/bin/env perl

use strict;
use warnings;

# this reformats the SEL file to remove the first line and replace the " with nothing

my $file = shift;
my $temp = shift;
my $linesH = shift;

open my $in,  '<', $file      or die "Can't read old file: Inappropriate I/O control operation";
open my $out, '>', $temp or die "Can't write new file: Inappropriate I/O control operation"; 

my $firstLine = 1;                                                                               

while (my $line = <$in>){
  print "LINE: $line\n";
  if ($firstLine){                                                                                            
    $firstLine = 0;                                                                          
  } else {
    $line =~ s/"L/L/g; # replace "L with L
    $line =~ s/"/,/g;  # replace " with,
    $line =~ s/\s+//g; # concatenates it all into one line
    print $out $line;  
  }
} 
close $out;


open (part1, $temp) || die "Couldn't open selection file";
open (part2, ">", $linesH) || die "Couldn't open selection file";

while (my $temp_line = <part1>){
  print "TEMPLINE: $temp_line\n";    
  my $string = substr($temp_line, 0, -1);
  print part2 <<ENDGS;
$string
ENDGS
}

close(part2);

#### this creates the merge script from the output 
#### file from the previous loop.
open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";
open (SEL, $linesH) || die "Couldn't open selection file";  

#iterate over required files
while ( my $sel_line = <SEL> ){
  chomp $sel_line;            
  print STDOUT $sel_line;     
  print MergeScript <<"ENDGS";
CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="$sel_line"
GX             mergline.gx

ENDGS

}

and one alternative way of doing it..

#!/usr/bin/env perl
use strict;
use warnings;

my $file = shift;

open my $in,  '<', $file or die "Can't read old file: Inappropriate I/O control operation";
my @lines = <$in>;            # read in all the lines
shift @lines;                 # discard the first line
my $line = join(',', @lines); # join the lines with commas
$line =~ s/[\r\n"]+//g;       # remove the quotes and newlines

# print the line into the mergescript
open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";

print MergeScript <<"ENDGS";
CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="$line"
GX             mergline.gx

ENDGS
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you - you are a programming GOD. Wow. I wish I understood all those hieroglyphics but I'm thankful that you've solved my problem. Both solutions work and I like the elegance of your one.Thank you Lecstor, you've made my week.
umm, no, far from it, but thanks Adrian, definitely always happy to make someones week.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.