http://qs321.pair.com?node_id=527179

master_son has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks; The following is the code that I am using to upload a *.csv file via CGI and write its contents to another *.csv file However, when the destination file is written, I get blank rows in between each record.
my $upload_dir = "some directory"; my $evtFileName = 'testDoc'; my $empFileName = $query->param('filepath'); my $fh = upload('filepath'); $fh =~ s/(?=\n)/\r/g; open OUTFILE, ">".$upload_dir."\\".$empFileName or die "Cannot ope +n file ".$upload_dir."\\".$empFileName; while (<$fh>) { print OUTFILE; print; } close OUTFILE;

I am using CGI qw(:standard) and CGI::Simple CPAN modules for this

The code above contains the regex $fh =~ s/(?=\n)/\r/g; which I received earlier that is to convert UNIX or MAC CRs to DOS CRs. I was able to get it to do the work, but now it will not operate properly.

What am I doing wrong - or is there a good solution. Thank you in advance.

EDIT: Sorry - I am running the script on Windows 2003 Server (DOS) ---------------------
Keep your concentration here and now where it belongs - Qui-Gon Jinn

Replies are listed 'Best First'.
Re: Conversion of unix LF to DOS LF issues
by ikegami (Patriarch) on Feb 01, 2006 at 23:26 UTC

    You didn't specify on which system the script is running.

    • # Outputs file in DOS format. # Accepts input files in unix format. # Runs on DOS. { my $fh_in = upload('filepath'); open my $fh_out, ...; print $fh_out while <$fh_in>; }
    • # Outputs file in DOS format. # Accepts input files in unix format. # Runs on unix. { my $fh_in = upload('filepath'); open my $fh_out, ...; while (<$fh_in>) { chomp; print $fh_out "$_\r\n" } }

    As a bonus, here are more universal versions:

    • # Outputs file in DOS format. # Accepts input files in unix, DOS and Mac formats. # Runs on unix, DOS and Mac. my $text; { my $fh_in = upload('filepath'); binmode($fh_in); local $/; $text = <$fh_in>; } $text =~ s/\015\012?|\012/\015\012/g; { open my $fh_out, ...; binmode($fh_out); print $fh_out $text; }
    • # Outputs file in local format. # Accepts input files in unix, DOS and Mac formats. # Runs on unix, DOS and Mac. my $text; { my $fh_in = upload('filepath'); binmode($fh_in); local $/; $text = <$fh_in>; } $text =~ s/\015\012?|\012/\n/g; { open my $fh_out, ...; print $fh_out $text; }

    Update: Cleaned up my booboos.

      The first Bonus option worked for me. I tested it on the W2003 system and everything clicked. Thank you.
      ---------------------
      Keep your concentration here and now where it belongs - Qui-Gon Jinn
Re: Conversion of unix LF to DOS LF issues
by chas (Priest) on Feb 01, 2006 at 22:00 UTC
    I seem to remember using binmode on the filehandles in a situation like yours; that may do what you want without your having to do any line ending translation explicitly. That only is important on non-Unix systems as I recall.

      Indeed binmode with the appropriate layer (see PerlIO) or even directly specifying it in open's mode string may well be the best way to go.

      I'd also recommend reading this thread in which a similar issue is discussed at length.