Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Conversion of unix LF to DOS LF issues

by master_son (Acolyte)
on Feb 01, 2006 at 21:39 UTC ( #527179=perlquestion: print w/replies, xml ) Need Help??

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 (Pope) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://527179]
Approved by Old_Gray_Bear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2020-10-22 19:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (229 votes). Check out past polls.

    Notices?