Dateien in Array abschneiden
Marcus Vieß
- perl
Sorry das ich nochmals Poste aber ich kriegts einfach nicht hin.
Vielleicht könnte mir mal einer etwas mehr Info geben als "nimm den Split Befehl". Ich in seit 2 Stunden dran und es klappt nix.
16|Nachtschatten|N|http:balbla
15|Vampyres|V|http:niknak
14|Vampire|V|http:zappzerapp
Oben ist ein datenfile welches ich mit open ... ins @kat einlese.
wie kann ich jetzt die Daten so dezimieren das sie so im @kat stehen:
Nachtschatten|N|http:balbla
Vampyres|V|http:niknak
Vampire|V|http:zappzerapp
also jeweils der erste Eintrag rausfliegt ?
Halihallo
wie kann ich jetzt die Daten so dezimieren das sie so im @kat stehen:
Nachtschatten|N|http:balbla
Vampyres|V|http:niknak
Vampire|V|http:zappzerapp
my @arr = ('16|Nachtschatten|N|http:balbla', '15|Vampyres|V|http:niknak', '14|Vampire|V|http:zappzerapp');
for ( my $i=0; $i < @arr; $i++ ) {
my @sub = split( /|/, $arr[$i] );
$arr[$i] = join( '|', splice( @sub, 1 ) );
}
print join( "\n", @arr );
sowas?
Viele Grüsse
Philipp
Ich weiß zwar nicht was du getrieben hast aber es funktioniert.
Tausend Dank !!!
Halihallo
Ich weiß zwar nicht was du getrieben hast aber es funktioniert.
Dann hab ich das Ziel verfehlt! - Du sollst was dabei lernen, also:
- for ( my $i=0; $i < @arr; $i++ ) {
also, die Schlaufe dient dazu, um durch das Array zu "walken" (jedes Element einmal bearbeiten).
- my @sub = split( /|/, $arr[$i] );
hier wird das Array-Element nach '|' aufgesplittet. Das gibt dann etwa folgendes: ('16', 'Nachtschatten', 'N', 'http:balbla').
- $arr[$i] = join( '|', splice( @sub, 1 ) );
und hier splicen (Teilarray extrahieren) wir das oben erstellte Hilfsarray @sub; und zwar genau nach dem ersten Element, bis zum letzten (also lassen wir die '16' weg, den die interessiert dich ja nicht). Dann kommt noch der join (aus Array mach Zeichenkette), der das Array wieder zu einer Zeichenkette zusammenklebt.
- print join( "\n", @arr );
und jetzt wird das ganze ausgebenen, dass wir auch was davon haben und nicht nur die CPU..
Alles klar? - Wenn nicht, dann Frage! - Dazu ist das Forum da.
Viele Grüsse
Philipp
use Mosche;
Ich weiß zwar nicht was du getrieben hast aber es funktioniert.
Dann geh das ganze doch einfach mal durch:
my @arr = (
'16|Nachtschatten|N|http:balbla',
'15|Vampyres|V|http:niknak',
'14|Vampire|V|http:zappzerapp'
);
Das ist in einem Array deine Datei (zum lesen angenehmer formatiert).
for ( my $i=0; $i < @arr; $i++ ) {
Damit wird nun jede Zeile deines Array durchlaufen.
my @sub = split( /|/, $arr[$i] );
In @sub hat er jetzt die einzelnen Komponenten der aktuellen Zeile, jeweils am | getrennt (den '' vor dem '|' kannst du wegmachen, die Pipe muss IMHO nicht maskiert werden.
Für das aufteilen ist die Funktion split verantwortlich, die als Parameter einen regulären Ausdruck bekommt, der das Trennzeichen angibt (reg. Ausdruck durch /.../, Trennzeichen |).
$arr[$i] = join( '|', splice( @sub, 1 ) );
Jetzt macht er zwei Dinge, fangen wir dazu hinten an.
Mit der Funktion splice fertigt er einen Array an, der einen Ausschnitt aus einem anderem Array ist. Hier will er alle Teile des Arrays @sub bis auf das erste Element.
Der splice-Aufruf hat die Form:
splice ARRAY,OFFSET,LENGTH,LIST
Also erst der Ausgangsarray, dann die Anzahl der Elemente, die übersprungen werden, dann die ANzahl der auszuschneidenen Elemente, und dann eine Liste (ungefähr wie ein Array), mit dem diese ausgeschnittenen Elemente überschrieben werden. Die hinteren Elemente können jeweils weggelassen werden. Hier benutzen wir nur ARRAY und OFFSET, um den Array anzugeben und die Anzahl der zu überspringenden Elemente anzugeben.
Mit der Funktion join setzen wir die Teilkomponenten wieder zusammen, und zwar mit einem | als Trennzeichen. join nimmt als Parameter das Trennzeichen und dann den Array, den es zusammensetzen soll. Dieser Array ist der Teilsausschnitt, der von splice zurückgegeben wird.
}
Ich hoffe, das hilft dir.
use Tschoe qw(Matti);
Halihallo Matti
my @sub = split( /|/, $arr[$i] );
In @sub hat er jetzt die einzelnen Komponenten der aktuellen Zeile, jeweils am | getrennt (den '' vor dem '|' kannst du wegmachen, die Pipe muss IMHO nicht maskiert werden.
Das hat nix mit Pipe zu tun, sondern wird in einem regulären Ausdruck als "oder" interpretiert, was bestimmt zu ziemlich wirren Ausgaben führen wird. Oder hast du da andere Erfahrungen? :-))
Viele Grüsse
Philipp
use Mosche;
In @sub hat er jetzt die einzelnen Komponenten der aktuellen Zeile, jeweils am | getrennt (den '' vor dem '|' kannst du wegmachen, die Pipe muss IMHO nicht maskiert werden.
Das hat nix mit Pipe zu tun, sondern wird in einem regulären Ausdruck als "oder" interpretiert, was bestimmt zu ziemlich wirren Ausgaben führen wird. Oder hast du da andere Erfahrungen? :-))
Mist, voll verpennt. Ich hätte meine Aussagen doch mal validieren müssen, hab doch eh beim gesamten Text in die perldoc gelunst :-)
use Tschoe qw(Matti);
Halihallo Matti
In @sub hat er jetzt die einzelnen Komponenten der aktuellen Zeile, jeweils am | getrennt (den '' vor dem '|' kannst du wegmachen, die Pipe muss IMHO nicht maskiert werden.
Das hat nix mit Pipe zu tun, sondern wird in einem regulären Ausdruck als "oder" interpretiert, was bestimmt zu ziemlich wirren Ausgaben führen wird. Oder hast du da andere Erfahrungen? :-))
Mist, voll verpennt. Ich hätte meine Aussagen doch mal validieren müssen, hab doch eh beim gesamten Text in die perldoc gelunst :-)
Hehe, voll erwischt :-))
Viele Grüsse
Philipp
PS: Nächstes Mal bin ich wieder dran (passiert mir ja auch des öfteren) :-)