2009-07-11 2 views
0

données Exemples:En Perl, comment puis-je lire des parties de lignes correspondant à un critère?

603  Some garbage data not related to me, 55, 113 -> 

1-ENST0000  This is sample data blh blah blah blahhhh 
2-ENSBTAP0  This is also some other sample data 
21-ENADT)$  DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0  This is third sample data 
node #4   This is 4th sample data 
node #5   This is 5th sample data 

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
     44, 1,1,4,1 

17, 1150 

637     YYYYYY: 2 : % 

EDIT: Dans les données ci-dessus. La largeur de colonne est fixe pour les sections mais il y a peut-être des sections que je ne souhaite pas lire. les données de l'échantillon ci-dessus ont été modifiées pour refléter cela. Donc, dans ce fichier d'entrée, je veux lire le contenu de la première section '1-ENST0000' dans un tableau et le contenu de '2-ENSBTAP0' dans un tableau séparé et ainsi de suite.

Je ne parviens pas à venir avec un regex qui définira le modèle ... Les trois premières lignes ont <someNumber>-ENS<someotherstuf> et il peut aussi être node #<some number here>

+0

Les quatrième et cinquième lignes contiennent-elles vraiment le 'noeud # 4' et le 'noeud # 5'? C'est à dire. Est-ce que certaines des premières colonnes contiennent vraiment des espaces? –

+0

Je ne veux tout simplement pas lire aussi le titre. J'ai changé cette regex donc il lit ces en-têtes mais ne savait pas comment lire le contenu après le match si trouvé et laisser le match. –

+0

ouais. les quatrième et cinquième lignes portent l'en-tête du nœud n ° 4 et le nœud n ° 5. Après le titre, il y a des espaces, Oui. Donc, le contenu de tous les titres commence au même endroit et sont alignés .... –

Répondre

0

OK, en fonction de votre commentaire plus tard, c'est un peu différent que la question précédente. Aussi, je réalise maintenant que node #54 est une entrée valide dans la première colonne.

Mise à jour: Je réalise maintenant que vous n'avez pas besoin de la première colonne.

Mise à jour: En général, vous ne voulez ni ne devez traiter les tableaux de caractères en Perl.

Mise à jour: Maintenant que vous avez clarifié ce qui devrait et ne devrait pas être ignoré, voici une version qui traite de cela. Ajoutez des motifs au goût dans la condition if.

#!/usr/bin/perl 

use strict; 
use warnings; 

my @data; 

while (<DATA>) { 
    chomp; 

    if (/^[0-9]+-ENS.{5} +(.+)$/ 
      or /^node #[0-9]+ +(.+)$/ 
    ) { 
     push @data, [ split //, $1 ]; 
    } 
} 

use Data::Dumper; 
print Dumper \@data; 

__DATA__ 
603  Some garbage data not related to me, 55, 113 -> 

1-ENST0000  This is sample data blh blah blah blahhhh 
2-ENSBTAP0  This is also some other sample data 
21-ENADT)$  DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0  This is third sample data 
node #4   This is 4th sample data 
node #5   This is 5th sample data 

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
     44, 1,1,4,1 

17, 1150 

637     YYYYYY: 2 : % 

Quant à apprendre à pêcher, je vous recommande de lire tout ce qui touche à perldoc perltoc.

+0

Aussi dans ce cas, si je veux que chaque personnage soit stocké dans un autre tableau, je devrais changer @row = split '', $ _, 2; à @row = split \\, $ _, 2; ? –

+0

non non! ... les données commencent à une colonne fixe mais il y a d'autres sections dans le fichier avec la même largeur de colonne que je ne souhaite pas lire. Donc, je vais prendre l'expression rationnelle de votre version éditée précédente. –

+0

Voici votre commentaire d'en haut: "oui, les quatrième et cinquième lignes ont l'en-tête du noeud # 4 et le noeud # 5. Après le titre, il y a des espaces, Oui, donc le contenu commence par le même emplacement. .... - Aaron il ya 15 minutes " –

1

Est-ce vraiment un fichier à colonne fixe? Si oui, alors ne vous embêtez pas avec les expressions rationnelles. Juste divisé à la largeur de la colonne, peut-être couper les espaces blancs à partir de la colonne 1.

+0

+1 pour le signaler ... bien qu'il soit difficile d'être sûr que ce soit le cas selon le libellé de la question –

+0

Édité la question pour refléter cela. –

Questions connexes