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,
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
| [reply] |
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."
| [reply] [d/l] [select] |
|
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++;
| [reply] [d/l] [select] |
|
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: <%-{-{-{-<
| [reply] [d/l] [select] |
|
|
|