in reply to Re: duplicating the rows and joining three lines into one using perl script
in thread duplicating the rows and joining three lines into one using perl script

Yes .I have tried importing this csv into excel. I am not able to duplicate the rows and join. Any help would be appreciated. Here is my code:
#!/usr/bin/perl -w use strict; use Spreadsheet::WriteExcel; my $workbook = new Spreadsheet::WriteExcel("test.xls"); my $sheet = $workbook->add_worksheet(); my $moneyFormat = $workbook->add_format(); $moneyFormat->set_num_format('$#,##0'); my $boldFormat = $workbook->add_format(); $boldFormat->set_bold(); my $row=0; my @longest=(0,0,0,0,0,0,0); open(MOV, "<test.csv") || die "Can't open movies.csv: $!"; while(<MOV>) { chomp; my @fields = split(/,/, $_); for(my $col = 0; $col < @fields; $col++) { if ($row == 0) { $sheet->write($row, $col, $fields[$col], $boldFo +rmat); } else { if ($col == 2 or $col == 3) { $sheet->write($row, $col, $fields[$col], $moneyForma +t); } else { $sheet->write($row, $col, $fields[$col]) +; } } if ($longest[$col] < length($fields[$col])) { $longest[$col] = length($fields[$col]); } } $row++; } $longest[2]+=3; $longest[3]+=3; for(my $i = 0; $i < @longest; $i++) { $sheet->set_column($i,$i,$longest[$i]); } close(MOV); $workbook->close();
  • Comment on Re^2: duplicating the rows and joining three lines into one using perl script
  • Download Code

Replies are listed 'Best First'.
Re^3: duplicating the rows and joining three lines into one using perl script
by graff (Chancellor) on Oct 07, 2015 at 02:46 UTC
    Thank you for using code tags. There is absolutely no need to bring Excel into this process. If I understand correctly, here's what you want to do (in pseudo-code):
    while ( reading from the input file yields a line of data ) { if ( the line begins with "RS," ) { replace the newline character(s) at the end of the line with a c +omma save this line in a variable called $line_out } elsif ( the line begins with "RAd," ) { replace the final newline character(s) with a comma (just like a +bove) append this line to $line_out } elsif ( the line begins with "RC," ) { print $line_out with the current line appended to it. } }
    Rendering that in actual perl syntax is pretty simple, and will be less verbose than what I've shown. Let us know if you have a problem with that step.

    UPDATE: I added a more specific condition to get into the third block (for printing output), and I added commas to the regex-match conditions for all three blocks, just to be "safe".

    Another update: I didn't intend to be obtuse - here's what I meant in actual perl code:

    use strict; use warnings; my $line_out; open ( MOV, "<", "test.cxv" ) or die "test.csv: $!\n"; while (<MOV>) { if ( /^RS,/ ) { s/\s+$/,/; $line_out = $_; } elsif ( /^RAd,/ ) { s/\s+$/,/; $line_out .= $_; } elsif ( /^RC,/ ) { print $line_out . $_; } }
      Yes, it is a very simple problem, indeed, with a straight forward solution.

      Perhaps just a minor point: a comma probably needs to be added between the RS-RAD and RAD-RC concatenated lines.

        I was taking for granted, based on the OP examples, that the input would always be one RS line followed by one RAd line followed by one ore more RC lines. If that's true, then "$line_out" always starts fresh on each RS line, and accumulates content until the first RC line, at which point the current RC line is only appended in the print statement, and not permanently appended to $line_out.
Re^3: duplicating the rows and joining three lines into one using perl script
by Anonymous Monk on Oct 07, 2015 at 02:45 UTC