Comment puis-je rechercher une colonne particulière en Perl?

voix
0

J'ai un fichier texte qui contient des données. Je suis en train de chercher EA dans la colonne ID uniquement et imprime la ligne entière. Mais le code reconnaissent toutes les EA et imprime toutes les lignes. Quel code dois - je ajouter à satisfaire à la condition? Merci encore:-)!

DONNÉES:
Nom ID Âge
---------------------
Kriste, 22, EA 2008
J EA N, 21, ES4567
JAK, 45, EA 2008

Les impressions de code:
Kriste , 22, EA 2008
J EA N, 21, ES4567
JAK, 45, EA 2008

Sortie souhaitée:
KRIS, 22, EA 2008
Kane, 45, EA 2008,

file='save.txt';
open(F,$file)||die(Could not open $file);
while ($line=<F>){
if ($line=~ m/$EA/i) {
my @cells=($f1,$f2,$f3)= split ',',$line;
print <TD>f1</TD>;
print <TD>f2</TD>;
print <TD>f3</TD>;
}
Créé 04/11/2008 à 06:28
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
7

Une combinaison du code de brian et Jeremy fixe tous les problèmes:

use strict;
use warnings;

my $file = 'save.txt';
open my $fh, "<", $file or die "Could not open $file: $!";

while ($line = <$fh>)
{
    my($f1, $f2, $f3) = split ',', $line;
    if ($f3 =~ m/EA/i)
    {
        print "<TD>$f1</TD>";
        print "<TD>$f2</TD>";
        print "<TD>$f3</TD>";
    }
}

Brian avait généralisé le modèle de correspondance avec use CGI;et my $EA = param('keyword');mais je défaisait que je ne voyais pas comme applicable à la question.

Créé 04/11/2008 à 08:35
source utilisateur

voix
5

Vous devez envoyer le programme d'échantillonnage réel que vous utilisez pour illustrer le problème. Voici votre programme démaquillé:

use strict;
use warnings;

use CGI;

my $EA = param('keyword');

my $file = 'save.txt';
open my $fh, "<", $file or die "Could not open $file: $!";

while( $line=<$fh> ) {
   if( $line=~ m/$EA/i ) {
       my( $f1, $f2, $f3 ) = split ',', $line;
       print "<TD>$f1</TD>";
       print "<TD>$f2</TD>";
       print "<TD>$f3</TD>";
       }
   }

Voici quelques petites choses qui peuvent vous aider.

  • Vos variables doivent leurs sigils. Ils ne font rien sans eux.
  • Lorsque vous essayez d'ouvrir un fichier et que vous voulez signaler une erreur, inclure le $! variable de sorte que vous voyez ce que l'erreur est.
  • Vous pouvez diviser directement aux variables scalaires. Il est juste une affectation de liste. Vous n'avez pas besoin de la variable @cell supplémentaire.
  • Donnez à vos déclarations un peu d'espace pour respirer en utilisant quelques espaces. Il est gratuit, après tout.
Créé 04/11/2008 à 08:21
source utilisateur

voix
3

Tu as presque eu, je pense que cela devrait fonctionner:

file='save.txt';
open(F,$file)||die("Could not open $file");

while ($line=<F>){
  my @cells=($f1,$f2,$f3)= split ',',$line;
  if ($f3=~ m/$EA/i) {
    print "<TD>f1</TD>";
    print "<TD>f2</TD>";
    print "<TD>f3</TD>";
  }
}

Cela divise la ligne en colonnes d' abord , et fait alors l'expression rationnelle que sur la troisième colonne.

BTW votre code peut avoir d'autres problèmes (par exemple les déclarations d'impression ne regardent pas comme ils impriment les valeurs de vos variables) mais je ne sais pas perl très bien donc je ne répondais à votre question principale ...

Créé 04/11/2008 à 06:35
source utilisateur

voix
2

Plutôt que d' essayer de faire vous - même l' analyse syntaxique CSV, utilisez l'excellent et efficace Text :: CSV_XS . Cela va gérer les évasions et en citant.

#!/usr/bin/perl -w

use Text::CSV_XS;

my $csv = Text::CSV_XS->new();

# Skip to the data.
while(<DATA>) {
    last if /^-{10,}$/;
}

while( my $row = $csv->getline(*DATA) ) {
    print "@$row\n" if $row->[2] =~ /EA/;
}


__DATA__
Name Age ID
---------------------
KRISTE,22,EA2008
J**EA**N,21,ES4567
JAK,45,EA2008
Créé 06/11/2008 à 07:23
source utilisateur

voix
1

Alternativement, vous pouvez modifier votre regex pour correspondre seulement le troisième élément de la liste:

/[^,]*,[^,]*,.*EA/
Créé 04/11/2008 à 17:01
source utilisateur

voix
0

Votre regex est incorrect pour ce que vous essayez de faire. La solution de Ben fonctionne, bien qu'il devrait aussi être un ^ au début, ce qui assure que le regex commencera correspondant à partir du début de la chaîne:

/ ^. ?,. ?,. * EA /

En outre, votre code est un peu bruyant, d'un point de vue de la perl. Si vous voulez rendre votre code plus facile à lire, vous pouvez le faire (j'utilise regex Ben):

$f = 'save.txt';

open( F, $file );

@matches = grep { /^.?,.?,.*EA/ } <F>;

Maintenant @matches détiendront tous vos dossiers assortis, vous pouvez faire ce que vous voulez avec eux.

Créé 04/11/2008 à 18:17
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more