Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: duplicating the rows and joining three lines into one using perl script

by graff (Chancellor)
on Oct 07, 2015 at 02:04 UTC ( [id://1144009]=note: print w/replies, xml ) Need Help??


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

That seems pretty simple and straightforward. What have you tried? Is there something stopping you from trying?
  • Comment on Re: duplicating the rows and joining three lines into one using perl script

Replies are listed 'Best First'.
Re^2: duplicating the rows and joining three lines into one using perl script
by rpinnam (Novice) on Oct 07, 2015 at 02:30 UTC
    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();
      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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2024-04-25 22:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found