http://qs321.pair.com?node_id=11106870


in reply to Re^4: Cutting text from the end of the file and adding it to the top
in thread Cutting text from the end of the file and adding it to the top

$ cat tmp/tmp.pl && perl tmp/tmp.pl #!/usr/bin/perl # use strict; use warnings; my $heading=readline(DATA); my @headings=split/,/,$heading; print $heading; my (@index,@values); while(<DATA>){ chomp; if (/^(\w+),\s*$/){ push @index,$1; } else{ @values=split/,/,$_; } } my $row = 0; for my $record (@index){ print join(",\t", $record, @values[(scalar(@headings) * $row) .. ( +(scalar(@headings) * $row) + $#headings -1)]),"\n"; $row++; } __DATA__ a, b, c, d aa, bb, aa, bb, 12,33,102,111,223,24,88,56,99,130,21,45,88,90,212,500 a, b, c, d aa, 12, 33, 102 bb, 223, 24, 88 aa, 99, 130, 21 bb, 88, 90, 212
I trimmed the trailing "," in your headings line as that breaks the CSV standard, but your format seems variable so...
print "Good ",qw(night morning afternoon evening)[(localtime)[2]/6]," fellow monks."

Replies are listed 'Best First'.
Re^6: Cutting text from the end of the file and adding it to the top
by oysterperl (Novice) on Oct 01, 2019 at 05:26 UTC
    Hi, Sorry for the confusion, the file is a CSV file and every entry has a comma after it as a delimiter. (the format was not finalized but now it is CSV). So the output should be the following, spaces are not needed in the output file, it only needs to be comma separated. Also I have added the numbers 999, 9999 to the input so as to make each row in the output complete.
    a, b, c, d, aa, 12, 33, 102, bb, 111, 223, 24, aa, 88, 56, 99, bb, 130, 21, 45, aa, 88, 90, 212, bb, 500, 999, 9999
    Also I need to print it back to the same file. Do I add the file pointer after the print statement below to print it back to the same file?
    for my $record (@index){ print DATA join(",\t", $record, @values[(scalar(@headings) * $row) + .. ( +(scalar(@headings) * $row) + $#headings -1)]),"\n"; $row++;

          a,       b,    c,   d,
      There seem to be four column labels, but
      aa,     12,     33,     102,
      each row now has three data fields. Also, CSV records don't usually end in a separator (comma) field.

      I'm assuming this is all some kind of elaborate troll, but I really can't see the entertainment value.


      Give a man a fish:  <%-{-{-{-<

        Sorry for that, it was a typo. The number of columns will match the data. So it should be like this:
        a, b, c, d aa, 12, 33, 102, 111 bb, 223, 24, 88, 56 aa, 99, 130, 21, 45 bb, 88, 90, 212, 500