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 " ";
}
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>