Hi,

I am trying to create a CGI script that will take a CSV file and 
convert it to a tilde-separated values file. The file should be sent 
to the browser so the user can choose to select-all the text or save 
the page as a text file. The problem is that the browser does not 
appear to be showing the converted text, just the original csv text.

So given 2 lines like this:
GRALEA00,MIKE,KAY,MP1,09/01/2006
HEINEM00,EMMA,LYNCH,MP1,09/01/2006

I would like output like this:
~GRALEA00~MIKE~KAY~MP1~09/01/2006
~HEINEM00~EMMA~LYNCH~MP1~09/01/2006

It is strange because the output to STDERR looks correct and if I run 
a snippet of code on the command line it works as I'd expect.

I am not sure if there is something wrong with my logic or my 
understanding of the http headers. 

There is another curiosity: If the browser is IE, it asks the user to 
save/open the file. If you open (and have perl installed) it tries to 
run the the file ~cgi-bin/convert-csv.pl?. I have tried using the 
content-disposition header but this doesn't appear to make a 
difference. Any tips here would be useful.

The script and some sample data are below.

Thanx in advance.
Dp.




================== convert-csv.pl ===========
#!/usr/bin/perl -w

#############
# import a csv file into a tilde separated file or vice-versa 
###############

use CGI;
use CGI::Carp qw(fatalsToBrowser);
$CGI::POST_MAX = 1024 * 1000; # Set limit to 1MB 
use strict;
use warnings;
use Text::ParseWords;

my $q = new CGI;
my $state = get_state($q);
if (! defined($state) ) {

# If this is the first time it's run create a input form.

        print $q->header(-type=>'text/html',
                         -expires=>'now',
                        );
        print $q->start_html(
                        -BGCOLOR => '#777777',
                        -script =>{-language => 'JAVASCRIPT',
                                   -src => '/js/convert-csv.js', 
                                  },
                        -style =>{-src=>'/css/convert-csv.css'},
                        );
        print $q->start_form(
                        -enctype => "multipart/form-data",
                        -method => 'post',
                        -name => 'convertfile',
#                       -action => "/cgi-bin/convert-csv.pl",
                        );

        print "Import ";
        print $q->filefield(-name=>'uploaded_file',
                        -size=>30,
                        -maxlength=>100);
        print "<p>";
        print "<div id='buttons' name='buttons' class='buttons'>";
        print $q->button(-name=>'csv',
                         -value=>'csv to tilde',
                         -onClick=>"Convert('csv')",
                        );
        my $nb;
# Would love to use an image here but don't know how!
        for ($nb = 0;$nb < 8;++$nb) {
                print "&nbsp;";
        }
        print $q->button(-name=>'tsv',
                         -value=>'tilde to csv',
                         -onClick=>"Convert('tsv')",
                        );
        print "</div>";
        print $q->hidden("filetype","");        
        
        print $q->end_html;
}
else {
        my $filename = $q->param('uploaded_file');
        my $csv_type = $q->param('filetype');
        print $q->header(-type=>'text',
                         -expires=>'now',
                         -Content-Disposition=>"$filename",
                        );

        my $filename = $q->param('uploaded_file');
        my $csv_type = $q->param('filetype');
        my $untainted_filename;
        my $type = $q->uploadInfo($filename)->{'Content-Type'};
        unless ($type eq 'text/plain' or 'text/html') {
                print STDERR "Type = $type\n";
                die "Text files only";
        }
        if (! $filename && $q->cgi_error) {
                print $q->header(-status=>$q->cgi_error);
                exit 0;
        }
        (my $tmp_name = $filename) =~ s/\W+/_/g; 
        if ($tmp_name =~ /^([-\@:\/\\\w.]+)$/) {
                    $untainted_filename = $1;
        }
        else {
               die <<"EOT";
Unsupported characters in the filename "$tmp_name". 
Your filename may only contain alphabetic characters and numbers, 
and the characters '_', '-', '\@', '/', '\\' and '.'
EOT
        }
        my $output_file = "/tmp/"."$tmp_name".".tmp";
        my ($bytesread,$buffer);
        my $numbytes = 1024;
# Read in input file and create.
        open(OUT, ">$output_file") or die "Can't open $output_file: $!\n";
        while ( $bytesread = read($filename, $buffer, $numbytes)) {
                print OUT $buffer; 
                print $buffer; 
        }
        close(OUT);

# set the input file type
        my $delim;
        my $fld_sep;
        if ( $csv_type =~ /csv/) {
                $delim = ',';
                $fld_sep = "~";
        }
        else {
                $delim = '~';
                $fld_sep = ",";
        }
print STDERR "Type=$csv_type, Delimiter = \"$delim\", field separator 
= \"$fld_sep\"\n";
open(FH,$output_file) or die "Can't open $output_file to conversion: 
$!\n";
        while (<FH>) {
#               s/\W//;
#               s/\t//;
#               tr/"\x7f"//;
#               tr/"[FFF]"//;
#               tr/"[\201-\377]"/"[\001-\177]"/;
#               print STDERR "Delimiter = \"$delim\", new field separator = 
\"$fld_sep\"\n";
                my @words = parse_line($delim,0,$_);
                foreach my $w (@words) {
                        s/$delim//; 
                        print STDERR $w.$fld_sep;
                        print $w.$fld_sep;
                }
        }
unlink($output_file);

}


sub get_state {
 my $q = shift;
 return undef unless $q->param();
 my $state = {};
 my @names = $q->param;
 foreach (@names ) {
        my $f = $q->param($_);
        $state->{$_} = $q->param($_);
#       print STDERR "$_ => $f\n";
 }
 return $state;
}
        
====================================


======== Input file =====================

AFFINI00,KERRY,WHITE,MP1,09/01/2006
CORMAR00,HANNAH,LONG,MP1,09/01/2006
PUBLIC00,SAM,PATON-SMITH,MP1,09/01/2006
HOOGAL00,DAVE,WESTLAND,MP1,09/01/2006
RIZKMC00,JOHN,MCCAY,MP1,09/01/2006
MCSAAT00,EMILY,TAYLOR,MP1,09/01/2006
WUNDER00,ANNA,GAUGHAN,MP1,09/01/2006
PANADV00,MARTIN,VILLARD,MP1,09/01/2006
ALLKYT00,CLIVE,DURBIN,MP1,09/01/2006
MCDPOS00,LINDA,MCDONALD,MP1,09/01/2006
GIRBOO00,SIMON,DALEY,MP1,09/01/2006
LIFCAR00,ROGER,HENWOOD,MP1,09/01/2006
CAMUNI20,WILNA,BOTHA,MP1,09/01/2006
PHIALL00,RACHEL,FURSE,MP1,09/01/2006
KENGRA00,EMILY,HOOTON,MP1,09/01/2006
INSGUI00,JENNY,CROUSE,MP1,09/01/2006
INSGUI00,HILARY,GENIN,MP1,09/01/2006
REEPRI00,ALEXANDRA,TATTAM,MP1,09/01/2006
TOUCAN00,CHRISTINE,HINSEY,MP1,09/01/2006
BLACKP00,BRIAN,JOHNSON,MP1,09/01/2006
SORTOF00,NATANIA,JANSZ,MP1,09/01/2006
BMJPUB00,SALLY,CARTER,MP1,09/01/2006
EQUPUB00,VALERIE,HALL,MP1,09/01/2006
PICPRE00,CLEMENTINE,KOENIG,MP1,09/01/2006
MICOMA00,JUDITH,PALMER,MP1,09/01/2006
IMPLTD00,RICHARD,SHINER,MP1,09/01/2006
HODWAY00,KIRSTY,HAMILTON,MP1,09/01/2006
HARCOL00,EMILY,PITCHER,MP1,09/01/2006
ARCTUR00,ROBERTA,BAILEY,MP1,09/01/2006
MCGRAW01,MARIA,DECAMBRA,MP1,09/01/2006
USBPUB01,KATE,FEARN,MP1,09/01/2006
PHILIP00,CHRISTIAN,HUMPHRIES,MP1,09/01/2006
OCTPUS00,CHRISTINE,JUNEMANN,MP1,09/01/2006
GRALEA00,MIKE,KAY,MP1,09/01/2006
HEINEM00,EMMA,LYNCH,MP1,09/01/2006
BRIBOO00,LYNDA,MARSHALL,MP1,09/01/2006
OXUNPR00,PIPPA,MCNEE,MP1,09/01/2006
BLASCI01,CEE,PIKE,MP1,09/01/2006
ARCPRE00,ALISON,YATES,MP1,09/01/2006
TRANSW00,GAVIN,MORRIS,MP1,09/01/2006
GALHEA00,PAULA,DA SILVA,MP1,09/01/2006
PHASE200,CHRISTINE,MULROONEY,MP1,09/01/2006

=======================================


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to