Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

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

by oysterperl (Novice)
on Sep 30, 2019 at 10:34 UTC ( [id://11106868]=note: print w/replies, xml ) Need Help??


in reply to Re^3: 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

Thanks, no I just gave an example of serial numbers, but the numbers can be any random numbers and the numbers are relevant. example: Input:
a, b, c, d, aa, bb, aa, bb, 12,33,102,111,223,24,88,56,99,130,21,45,88,90,212,500
Desired output:
a, b, c, d, aa, 12, 33, 102, 111, bb, 223, 24, 88, 56, aa, 99, 130, 21, 45, bb, 88, 90, 212, 500,

Replies are listed 'Best First'.
Re^5: Cutting text from the end of the file and adding it to the top
by poj (Abbot) on Sep 30, 2019 at 11:54 UTC

    What is the format of your text file ?

    In your original post it was whitespace delimiter with all data on the last line. On this post your data is over the last 2 lines (which is why Athanasius's script does not work for you) and on your latest post the data is comma delimited.

    poj
Re^5: Cutting text from the end of the file and adding it to the top
by Utilitarian (Vicar) on Sep 30, 2019 at 12:21 UTC
    $ 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."
      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:  <%-{-{-{-<

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11106868]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (2)
As of 2024-04-25 05:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found