Solved

changing the output of data to the textfile

Posted on 2009-07-12
4
205 Views
Last Modified: 2012-05-07
the code I have below sets out data as shown :

232      356      434      767      786      854      avg 571.50      group 0011100210
124      78      333      19      68            avg 124.40      

how do I change the code to make the output all of the above but on the one line:

232,356,434,767,786,854,avg1,571.50,0011100210124,78,333,19,68,avg2,124.40


#!/usr/bin/perl
use POSIX;
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(sum);
 
my $startTime = time();
 
##### Open files
open(my $IN,"invim2.vim") or die "Could not open input: $!\n";
open(my $OUT,">outvim2.vim") or die "Could not open output: $!\n";
 
my @avgs1;
my @avgs2;
my ($maxavg1, $minavg1, $maxavg2, $minavg2);
 
        ##### Step 1: read a line, and split it on comma
        while(<$IN>){
        chomp;
        my @arr = split /,/;
        next unless @arr;
 
 
        # discard 1st and 2nd last and last item
        shift @arr;
        pop @arr;
        pop @arr;
	# pop @arr;
 
 
        ##### Step 2: Sort data into ascending order
        @arr = sort {$a <=> $b} @arr;
        # print "arr @arr\n";
 
 
        ##### Step 3: Calculate difference between neighboring pairs
        my @diff = (map {$arr[$_] - $arr[$_-1]} (1..$#arr));
        #  print "diff @diff\n";
 
 
        ##### Step 4: Calculate amount in each group
        my @groups = (0)x10;
        foreach my $a (@arr) {
                $groups[$a/100]++;
        }
        #   print "group @groups\n";
 
 
        ##### Step 5: Calculate average
 
        my $avg1 = sum(@arr)/@arr;
        # printf "arr avg %.2f\n", $avg1;
        if(!$maxavg1 || $avg1 > $maxavg1) { $maxavg1 = $avg1; }
        if(!$minavg1 || $avg1 < $minavg1) { $minavg1 = $avg1; }
        push @avgs1, $avg1;
 
        my $avg2 = sum(@diff)/@diff;
        # printf "diff avg %.2f\n", $avg2;
        if(!$maxavg2 || $avg2 > $maxavg2) { $maxavg2 = $avg2; }
        if(!$minavg2 || $avg2 < $minavg2) { $minavg2 = $avg2; }
        push @avgs2, $avg2;
 
        ##### Step 6: Print results
        print $OUT join("\t", @arr) . "\tavg " . sprintf("%.2f\t", $avg1) . "group " . join("", @groups) . "\n";
        print $OUT join("\t", @diff) . "\t\tavg " . sprintf("%.2f\t", $avg2) . "\n";
        print $OUT "\n";
}
 
my $stopTime = time();
my $totalTime = $stopTime - $startTime;
 
#  printf "input: maxavg %d minavg %d avgavg %d\n", $maxavg1, $minavg1, sum(@avgs1)/@avgs1;
printf $OUT "For data values:\t\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs1)/@avgs1, $maxavg1, $minavg1 ;
#  printf "diff: maxavg %d minavg %d avgavg %d\n", $maxavg2, $minavg2, sum(@avgs2)/@avgs2;
printf $OUT "For data difference values:\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs2)/@avgs2, $maxavg2, $minavg2, ;
 
printf "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
printf $OUT "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
 
 
close($IN);
close($OUT);

Open in new window

0
Comment
Question by:Europa MacDonald
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
4 Comments
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24836542
Try this.

The line I changed:

printf $OUT "%s,avg1,%.2f,%s,%s,%.2f\n", join(",", @arr), $avg1, join("", @groups), join(",", @diff), $avg2;
use POSIX;
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(sum);
 
my $startTime = time();
 
##### Open files
open(my $IN,"invim2.vim") or die "Could not open input: $!\n";
open(my $OUT,">outvim2.vim") or die "Could not open output: $!\n";
 
my @avgs1;
my @avgs2;
my ($maxavg1, $minavg1, $maxavg2, $minavg2);
 
        ##### Step 1: read a line, and split it on comma
        while(<$IN>){
        chomp;
        my @arr = split /,/;
        next unless @arr;
 
 
        # discard 1st and 2nd last and last item
        shift @arr;
        pop @arr;
        pop @arr;
        # pop @arr;
 
 
        ##### Step 2: Sort data into ascending order
        @arr = sort {$a <=> $b} @arr;
        # print "arr @arr\n";
 
 
        ##### Step 3: Calculate difference between neighboring pairs
        my @diff = (map {$arr[$_] - $arr[$_-1]} (1..$#arr));
        #  print "diff @diff\n";
 
 
        ##### Step 4: Calculate amount in each group
        my @groups = (0)x10;
        foreach my $a (@arr) {
                $groups[$a/100]++;
        }
        #   print "group @groups\n";
 
 
        ##### Step 5: Calculate average
 
        my $avg1 = sum(@arr)/@arr;
        # printf "arr avg %.2f\n", $avg1;
        if(!$maxavg1 || $avg1 > $maxavg1) { $maxavg1 = $avg1; }
        if(!$minavg1 || $avg1 < $minavg1) { $minavg1 = $avg1; }
        push @avgs1, $avg1;
 
        my $avg2 = sum(@diff)/@diff;
        # printf "diff avg %.2f\n", $avg2;
        if(!$maxavg2 || $avg2 > $maxavg2) { $maxavg2 = $avg2; }
        if(!$minavg2 || $avg2 < $minavg2) { $minavg2 = $avg2; }
        push @avgs2, $avg2;
 
        ##### Step 6: Print results
        printf $OUT "%s,avg1,%.2f,%s,%s,%.2f\n", join(",", @arr), $avg1, join("", @groups), join(",", @diff), $avg2;
}
 
my $stopTime = time();
my $totalTime = $stopTime - $startTime;
 
#  printf "input: maxavg %d minavg %d avgavg %d\n", $maxavg1, $minavg1, sum(@avgs1)/@avgs1;
printf $OUT "For data values:\t\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs1)/@avgs1, $maxavg1, $minavg1 ;
#  printf "diff: maxavg %d minavg %d avgavg %d\n", $maxavg2, $minavg2, sum(@avgs2)/@avgs2;
printf $OUT "For data difference values:\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs2)/@avgs2, $maxavg2, $minavg2, ;
 
printf "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
printf $OUT "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
 
 
close($IN);
close($OUT);

Open in new window

0
 
LVL 40

Accepted Solution

by:
mrjoltcola earned 500 total points
ID: 24836558
Oops I missed the "avg2" word

printf $OUT "%s,avg1,%.2f,%s,%s,avg2,%.2f\n", join(",", @arr), $avg1, join("", @groups), join(",", @diff), $avg2;
#!/usr/bin/perl
use POSIX;
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(sum);
 
my $startTime = time();
 
##### Open files
open(my $IN,"invim2.vim") or die "Could not open input: $!\n";
open(my $OUT,">outvim2.vim") or die "Could not open output: $!\n";
 
my @avgs1;
my @avgs2;
my ($maxavg1, $minavg1, $maxavg2, $minavg2);
 
        ##### Step 1: read a line, and split it on comma
        while(<$IN>){
        chomp;
        my @arr = split /,/;
        next unless @arr;
 
 
        # discard 1st and 2nd last and last item
        shift @arr;
        pop @arr;
        pop @arr;
        # pop @arr;
 
 
        ##### Step 2: Sort data into ascending order
        @arr = sort {$a <=> $b} @arr;
        # print "arr @arr\n";
 
 
        ##### Step 3: Calculate difference between neighboring pairs
        my @diff = (map {$arr[$_] - $arr[$_-1]} (1..$#arr));
        #  print "diff @diff\n";
 
 
        ##### Step 4: Calculate amount in each group
        my @groups = (0)x10;
        foreach my $a (@arr) {
                $groups[$a/100]++;
        }
        #   print "group @groups\n";
 
 
        ##### Step 5: Calculate average
 
        my $avg1 = sum(@arr)/@arr;
        # printf "arr avg %.2f\n", $avg1;
        if(!$maxavg1 || $avg1 > $maxavg1) { $maxavg1 = $avg1; }
        if(!$minavg1 || $avg1 < $minavg1) { $minavg1 = $avg1; }
        push @avgs1, $avg1;
 
        my $avg2 = sum(@diff)/@diff;
        # printf "diff avg %.2f\n", $avg2;
        if(!$maxavg2 || $avg2 > $maxavg2) { $maxavg2 = $avg2; }
        if(!$minavg2 || $avg2 < $minavg2) { $minavg2 = $avg2; }
        push @avgs2, $avg2;
 
        ##### Step 6: Print results
        printf $OUT "%s,avg1,%.2f,%s,%s,avg2,%.2f\n", join(",", @arr), $avg1, join("", @groups), join(",", @diff), $avg2;
}
 
my $stopTime = time();
my $totalTime = $stopTime - $startTime;
 
#  printf "input: maxavg %d minavg %d avgavg %d\n", $maxavg1, $minavg1, sum(@avgs1)/@avgs1;
printf $OUT "For data values:\t\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs1)/@avgs1, $maxavg1, $minavg1 ;
#  printf "diff: maxavg %d minavg %d avgavg %d\n", $maxavg2, $minavg2, sum(@avgs2)/@avgs2;
printf $OUT "For data difference values:\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs2)/@avgs2, $maxavg2, $minavg2, ;
 
printf "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
printf $OUT "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
 
 
close($IN);

Open in new window

0
 

Author Closing Comment

by:Europa MacDonald
ID: 31602668
excellent, thank you
0
 

Author Comment

by:Europa MacDonald
ID: 24843541
so would that look like this in code to open data file and write to another file ?

use strict;
use warnings;

 

 
##### Open files

open(my $IN,"outvim2.vim") or die "Could not open input: $!\n";
open(my $OUT,">groupsort.vim") or die "Could not open output: $!\n";


my $Group_Min = 501;
my $Group_Max = 550;
my $Group_Count = 10;
 
my @averages = qw(571.50 551.50 551.17 531.17);
 
my @groups = (0)x$Group_Count;
foreach (@averages) {
        my $group = ($_ - $Group_Min)/$Group_Count;   #This calculates the group
        $group = 0 if $group < 0;    #In case you have a number below the expected min
        $group = $Group_Count-1 if $group >= $Group_Count;    #In case you have a number above the expected max
        $groups[$group]++;
}
 
print OUT join(", ", @groups) . "\n"
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Six Sigma Control Plans

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question