2009-10-07 6 views
0

Je crée une page Web pour sélectionner des options à partir d'un fichier CSV:Comment puis-je créer un menu déroulant HTML à partir d'un fichier CSV en Perl?

Exemple de fichier CSV:

Time,h1,h2,h3,.... 
00:00:00,n1,n2,n3..... 
.....so on 


h -> header 
n -> numbers 

est en dessous du sous-programme de code Perl je l'ai écrit pour filtrer l'en-tête et les valeurs et le retour :

sub TimeData 
{ 
    use Text::CSV; 
    my @time; 
    my @data; 
    my ($csv_file, $type) = @_; 
    open(my $csv_fh, '<', $csv_file) or die $!; 
    my $parser = Text::CSV->new(); 
    $parser->column_names($parser->getline($csv_fh)); 
    while (defined(my $hr = $parser->getline_hr($csv_fh))) 
    { 
     push @time, $hr->{Time}; 
     push @data, $hr->{$type}; 
    } 

    return (@time, @data); 
} 

Je veux créer une page où le champ d'entrée a un menu déroulant avec les listes de h1, h2, h3, etc. la valeur d'en-tête sélectionné peut être utilisé comme une entrée dans un autre script Perl. Quelqu'un peut-il s'il vous plaît suggérer du code pour y arriver.

+0

Que utilisez le temps que vous pour? – DVK

+0

Je dois utiliser l'heure pour d'autres choses dans les différentes pages de ce site. – Space

+0

Pouvez-vous nettoyer un peu la grammaire de votre dernier paragraphe? Ce n'est pas clair ce que vous demandez. Voulez-vous un menu déroulant, ou plusieurs, et ce qui devrait être dans eux? Quels problèmes avez-vous avec les générer? –

Répondre

3

Notez que votre instruction return est problématique: Les deux tableaux seront aplatis en un et le code appelant ne sera pas en mesure d'affecter les valeurs de retour à deux tableaux séparés. Si vous souhaitez conserver l'esprit de cette interface, vous devez renvoyer des références à ces tableaux. Voir perldoc perlsub:

Une déclaration return peut être utilisé pour sortir d'un sous-programme, en précisant le cas échéant la valeur renvoyée, qui sera évalué dans le contexte approprié (liste, scalaire ou vide) en fonction du contexte de l'appel de sous-programme . ... Si vous retournez un ou plusieurs agrégats (tableaux et hachages), ceux-ci seront aplatis ensemble dans une grande liste indiscernable.

En utilisant split parce que l'ordinateur je tape ceci sur n'a ni Text::CSV ni Text::xSV].

#!/usr/bin/perl 

use strict; use warnings; 

my (@header) = map { chomp; split /,/} scalar <DATA>; 

while (my $line = <DATA>) { 
    last unless $line =~ /\S/; 
    chomp $line; 
    my (@values) = split /,/, $line; 
    print "<select>\n"; 
    for (my $i = 1; $i < @header; $i += 1) { 
     printf qq{<option name="%s" value="%s">%s = %s</option>\n}, 
       $header[$i], $values[$i], $header[$i], $values[$i]; 
    } 
    print "</select>\n"; 
} 

__DATA__ 
Time,h1,h2,h3 
00:00:00,n1,n2,n3 

Maintenant, si je fais quelque chose comme ça, je séparer la partie où je lis les données et où je générer le <SELECT></SELECT> et utiliser une approche basée sur le modèle de celui-ci. Voici un exemple:

#!/usr/bin/perl 

use strict; use warnings; 

use HTML::Template; 
use List::AllUtils qw(each_arrayref); 

my $select_html = <<EO_HTML; 
<select> 
<TMPL_LOOP OPTIONS> 
<option name="<TMPL_VAR HEADER>" 
value="<TMPL_VAR VALUE>"><TMPL_VAR HEADER> = <TMPL_VAR VALUE></option> 
</TMPL_LOOP> 
</select> 
EO_HTML 

my @headers = qw(h1 h2 h3); 
# Stand-in for rows you read from the CSV file 
my @values = ([qw(a1 a2 a3)], [qw(b1 b2 b3)]); 

print make_select(\$select_html, \@headers, $_)->output for @values; 

sub make_select { 
    my ($html, $headers, $values) = @_; 
    my $tmpl = HTML::Template->new(scalarref => $html); 

    my @options; 

    my $it = each_arrayref($headers, $values); 
    while (my ($h, $v) = $it->()) { 
     push @options, { HEADER => $h, VALUE => $v }; 
    } 
    $tmpl->param(OPTIONS => \@options); 
    return $tmpl; 
} 

Sortie:

<select> 

<option name="h1" 
value="a1">h1 = a1</option> 

<option name="h2" 
value="a2">h2 = a2</option> 

<option name="h3" 
value="a3">h3 = a3</option> 

</select> 
<select> 

<option name="h1" 
value="b1">h1 = b1</option> 

<option name="h2" 
value="b2">h2 = b2</option> 

<option name="h3" 
value="b3">h3 = b3</option> 

</select> 
+1

+1 pour une interprétation raisonnable de la question –

+0

N'oubliez pas d'échapper HTML dans les valeurs d'attribut et le texte en ligne. –

Questions connexes