2010-11-18 4 views
0

Je suis relativement nouveau à Perl et je ne connais pratiquement rien à la syntaxe «correcte» de Perl.Comment traiter correctement ce fichier contenant des valeurs séparées par des tabulations en Perl?

J'ai un fichier texte que j'utilise tous les jours avec une liste de noms, et d'autres informations pour nos utilisateurs. Ce fichier change tous les jours et comporte parfois deux lignes (délimitées par des tabulations) et d'autres fois plus de 100 lignes.

Le fichier varie également entre 6 et 9 colonnes de données d'affilée. J'ai mis en place un script Perl qui utilise la fonction split sur les onglets, mais le problème que je rencontre est que si je prends la ligne un, qui a 5 colonnes dedans, puis ajouter une deuxième ligne b qui a 6 colonnes qui sont toutes peuplées de données.

Je n'arrive pas à comprendre comment Perl voit que cette ligne a seulement 5 colonnes de données et continue d'analyser le fichier texte à partir de ce point. Cela continue, mais la sortie enveloppe étrangement les lignes. Comment puis-je contourner ce problème? J'espère que cela a du sens.

+5

Poster des données de code et de l'échantillon. – cdhowie

Répondre

4

Vous devrez poster un code et peut-être quelques exemples de données, mais voici un code qui est l'analyse des lignes de différentes longueurs sans problème.

Script:

#!/usr/bin/perl 
use strict; 

while (<STDIN>) 
{ 
    chomp; 
    my @info = split("\t"); 
    print join(";", @info), "\n"; 
} 

exit; 

fichier test:

jsmith 101  777-222-5555 Office 1  Building 1  Manager 
    aposse 104  777-222-5556 Office 2  Building 2  Stock Clerk 
    jbraza 105  777-222-5557 Office 3 
    mcuzui 102  777-222-5557 Office 3  Building 3  Cashier 
    ghines 107  777-222-5557 Office 3 

Sortie:

%> test.pl < file.txt 
jsmith;101;777-222-5555;Office 1;Building 1;Manager 
aposse;104;777-222-5556;Office 2;Building 2;Stock Clerk 
jbraza;105;777-222-5557;Office 3 
mcuzui;102;777-222-5557;Office 3;Building 3;Cashier 
ghines;107;777-222-5557;Office 3 
+0

J'ai réalisé l'erreur de ma façon, j'avais ma syntaxe fractionnée incorrecte. Merci, j'apprécie vraiment l'aide de tout le monde ici. Avoir une bonne après-midi. – Tim

1

Vous devriez publier des exemples de données et de code et expliquer le comportement souhaité en termes de ce que le code fait actuellement et de ce que vous voulez qu'il fasse. split vous donnera autant de champs qu'il y a dans l'entrée.

#!/usr/bin/perl 

use strict; use warnings; 

while (my $row = <DATA>) { 
    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 
    print "<@cells>\n"; 
} 

__DATA__ 
1 2 3 4 5 
a b c d e f 
+0

Merci pour l'aide, comme indiqué ci-dessus, j'avais ma syntaxe incorrecte. – Tim

1

Le modulepeut également être utilisé pour analyser des valeurs séparées par des tabulations. En réalité, Text::CSV pourrait analyser des valeurs délimitées par n'importe quel caractère.

extrait pertinent de son POD:

Le module accepte des chaînes ou fichiers en entrée et peut utiliser tous les caractères spécifiés par l'utilisateur comme délimiteurs, les séparateurs, et échappe donc il est peut-être mieux appelé ASV (toutes les valeurs séparées) plutôt que que juste CSV.

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Text::CSV; 

my $csv = Text::CSV->new({ 'sep_char' => "\t" }); 

open my $fh, '<', 'data.tsv' or die "Unable to open: $!"; 

my @rows; 
while (my $row_ref = $csv->getline($fh)) { 
    push @rows, $row_ref; 
} 

$csv->sep_char('|'); 
for my $row_ref (@rows) { 
    $csv->combine(@$row_ref); 
    print $csv->string(), "\n"; 
} 
Questions connexes