in reply to Equal line spacing in records of a file


In the absence of further information I had to make some assumptions:

1. That each record was delimited by #\d+, eg #1008
2. That the delimiter was preceded by Value and Tester

So that following might not be quite what you need but it will give you a start.

#!/usr/bin/perl -w use strict; my $rec_index; my @rec_refs; my @record; my $max = 0; my $count = 0; while (<DATA>) { $count++; push @record, $_; if (/#\d+/) { # Match the end of record push @rec_refs, [@record]; # Store the current record @record = (); $max = $count if $count > $max; # Track max fields in a rec +ord $count = 0; } } # Iterate through the stored records and add the extra fields foreach my $aref (@rec_refs) { $count = 0; foreach my $line (@$aref) { # Add extra fields before the "Tester" field print ",\n" x ($max - $count -3) if $line eq "Tester,\n"; print $line; $count++; } } __DATA__ Ent, Name, SC011, BUN, Tester, Value, #1008 Ent, Name, FS0022L, FUN, TL0324, PLEASE, Tester, Value, #1002 Ent, Name, SC004, TAKE, K530, RUN, K530, RUN, Tester, Value, #1001

--
John.

Replies are listed 'Best First'.
Re: Re: Equal line spacing in records of a file
by vanuatu10 (Initiate) on May 24, 2002 at 13:54 UTC
    Is there a way to give equal field spacing of thirty characters in each field of data in front of the comma?
    For example: (30 - field data) = additonal spacing Needed Output: Ent , Name , SCO11 , RUN , Current Data: Ent, Name, SCO11, RUN, Ent, Name, NA932, TAKE, I wrote the following code for equal spacing: $counter = 0; foreach(@newstuff){ $counter++; if(m/Ent/){ $counter=0;} if(m/Payor/){ if($counter > $hold){ $hold = $counter; } } } $counter2 = 0; foreach(@newstuff){ $counter2++; if(m/Ent/){ $counter2=0;} if(m/Payor/){ if($counter2 < $hold){ $temp = $counter2; for($temp;$temp < $hold; $temp++){ #for($j=0;$j < $hold; $j++){ s/Payor/\nPayor/; } } } }
    How can I make the file have equal field spacing? There has be be a was to count the contents of each line in the array and add, assuming staticval = 30, spaces before the commas of each field minus the charater in each field. In example, "Ent," would turn out to be staticval minus the number of characters found in Ent. This would be Ent followed by twenty-seven spaces and a comma.

    Edit kudra, 2002-05-25 Added code tags

      1. please use <code>..</code> tags when blanks are significant.
      2. sure there's a way: printf("%-30s,", $field);
      cheers,
      Aldo
      __END__ $_=q,just perl,,s, , another ,,s,$, hacker,,print;
      print pack('A30', $thing_that_should_be_30_chars_long); # or print pack('A30' x scalar(@stuff_to_pad), @stuff_to_pad);