2009-07-11 2 views
0

Beispieldaten:Wie kann ich in Perl Teile von Zeilen lesen, die einem Kriterium entsprechen?

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: In den obigen Daten. Die Spaltenbreite ist für die Abschnitte festgelegt, aber es gibt möglicherweise Abschnitte, die ich nicht lesen möchte. Die obigen Beispieldaten wurden bearbeitet, um dies widerzuspiegeln.

Also in dieser Eingabedatei möchte ich den Inhalt des ersten Abschnitts '1-ENST0000' in ein Array und den Inhalt von '2-ENSBTAP0' in ein separates Array und so weiter lesen.

ich Probleme mit einem regex kommen habe, die das Muster definieren ... ersten drei Zeilen <someNumber>-ENS<someotherstuf> haben und dann kann es auch node #<some number here>

+0

Enthält die vierte und fünfte Zeile wirklich 'node # 4' und 'node # 5'? I.e. enthalten einige der ersten Spalten wirklich Leerzeichen? –

+0

Ich möchte nur nicht auch die Überschrift lesen. Ich habe diesen Regex so geändert, dass er diese Überschrift liest, aber nicht wusste, wie er nach dem Spiel den Inhalt lesen soll, wenn er gefunden wird, und das Spiel nicht mehr sehen. –

+0

ja. Die vierte und fünfte Zeile haben die Überschrift von Knoten # 4 und Knoten # 5. Nach der Überschrift gibt es Leerzeichen, Ja. Also beginnen die Inhalte für alle Überschriften am selben Ort und sind ausgerichtet ... –

Antwort

0

OK, bezogen auf Ihren späteren Kommentar, das ist ein wenig anders als die vorherige Frage. Außerdem stelle ich jetzt fest, dass node #54 ein gültiger Eintrag in der ersten Spalte ist.

Update: Ich merke jetzt auch, dass Sie nicht die erste Spalte benötigen.

Update: Im Allgemeinen wollen und müssen Sie sich in Perl nicht mit Zeichenfeldern beschäftigen.

Update: Nun, da Sie geklärt haben, was sollte und sollte nicht übersprungen werden, hier ist eine Version, die damit befasst ist. Fügen Sie Muster hinzu, um im if Zustand zu schmecken.

#!/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 : % 

Wie für das Lernen, wie man Fisch empfehle ich Ihnen alles in perldoc perltoc im Zusammenhang lesen.

+0

Auch in diesem, wenn ich wieder jedes Zeichen in verschiedenen Elementen des Arrays gespeichert werden soll, sollte ich ändern @row = Split '', $ _, 2; zu @row = split \\, $ _, 2; ? –

+0

nein nein! ... Daten beginnen bei einer festen Spalte, aber es gibt andere Abschnitte in der Datei mit der gleichen Spaltenbreite, die ich nicht lesen möchte. Also nehme ich den Regex von Ihrer vorherigen bearbeiteten Version. –

+0

Hier ist Ihr Kommentar von oben: "Ja. Die vierte und fünfte Zeile haben die Überschrift von Knoten # 4 und Knoten # 5. Nach der Überschrift gibt es Leerzeichen, ja. Also beginnen Inhalte für alle Titel am gleichen Ort und sind ausgerichtet .... - Aaron vor 15 Minuten " –

1

Ist das wirklich eine Datei mit fester Spalte? Wenn ja, dann kümmern Sie sich nicht um Regexps. Einfach auf die Spaltenbreite aufteilen, eventuell nachlaufendes Leerzeichen aus dem ersten Bild abschneiden.

+0

+1 für den Hinweis darauf ... obwohl es schwierig ist, sicher zu sein, dass dies der Fall ist, basierend auf dem Wortlaut der Frage. –

+0

Edited die Frage, um dies zu reflektieren. –

Verwandte Themen