in reply to How to add a new column into my csv file?

Hi chaney123,

in which respect does your script not fulfill your needs?

I can see one coding error in this line:

print $output_1 "Item, Sink, Bufer, Cells, Slew, Path, Violation, Area +, Period, %Skew\n";
The $output_1 variable has not been defined (you presumably mean $outfile_1), but I assume that this is just a mistake while copying the code into your post, since this would generate a compile time error fairly easy to understand and to fix.

Besides that, the general algorithm seems correct to me for what you want to do. So, please tell us how your script fails to do what you want.

Replies are listed 'Best First'.
Re^2: How to add a new column into my csv file?
by chaney123 (Acolyte) on Sep 12, 2017 at 02:18 UTC

    Yea you are right! I copy my codes wrongly. It should be $outfile_1. My problem is that I have no idea on how to perform calculation from the csv files generated. I wish to generate a %skew by using the data in column 'skew' and 'period' *Formula: ('skew' / 'period')100.* Can you give me some idea on how to continue? Thanks

      while (my $line1 = <$file2>){ chomp $line1; # Item,Sink,Buffer,Cell,Slew,Path,Violation,Area my @f = split /,/, $line1 ; my $item = $f[0]; my $slew = $f[4]; next if $item eq 'Item'; # skip header if (defined $file1Hash{$item}) { my $period = $file1Hash{$item}; my $pc = sprintf "%.10f",100*$slew/$period unless ($period==0); print $outfile_1 join ',',$line1,$period,$pc."\n"; } }
      poj
      Just a quick piece of code that seems to be doing what you want:
      use strict; use warnings; use Data::Dumper; my $file1 = "an_en11,200.00,{0 133},{ } br_gh13,140.09,{0 59},{ } ce_oy74,300.05,{0 230},{int_43} dt_pp50,200.11,{0 122},{ } er_tk02,305.47,{0 220},{ } ef_yb41,200.05,{0 233},{ }"; open my $FH1, "<", \$file1 or die "cannot open $file1"; my %file1Hash; while (my $line = <$FH1>) { my ($item, $period) = split /,/, $line; $file1Hash{$item} = $period; } close $FH1; print Dumper \%file1Hash; my $file2 = "dt_pp50,0,0,2,0.000,0.000,0,0.000 er_tk02,0,2,3,0.002,0.004,0,0.001 ef_yb41,0,1,5,0.000,0.000,0,0.000"; open my $FH2, "<", \$file2 or die "cannot open $file2"; while (my $line = <$FH2>) { chomp $line; my ($item, $slew) = (split /,/, $line)[0,4]; next unless $file1Hash{$item}; # skip the line if the period is no +t defined or if it is 0 my $skew = 100 * $slew / $file1Hash{$item}; printf "%s,%d,%.8f\n", $line, $file1Hash{$item}, $skew; }
      Note that I embedded the input data into the code for simplicity of the test.

      And an sample execution (at the command line):

      Also note that I used split to keep closer to your code, but it would make sense to use Text::CSV_XS or Text::CSV as recommended earlier by other monks, especially if your input data gets more complicated.

      HTH.