User since
2006-12-05
10
Artikel
BenutzerIn
Hi Leute ,
ich habe folgenden Problem:
Meine Datei hat folgendes Format:
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n6.txt
dlf951121.1230.n4.txt
#
dlf951121.1200.n6.txt
dlf951121.1230.n4.txt
#
...etc...
Nun möchte ich die Dateiname jeweils immer bis zum nächsten # (also den ganzen Block) in einem entweder unterschiedliche Array oder noch besser den ersten Block unter @Block[1] den nächsten unter @Block[2] etc. speichern , so dass ich mit dem index 1 dann den ersten gesamten Block bekomme etc.
Ich hoffe es war einigermaßen verständlich.
Ich habe es mit split(/#/); versucht aber das ging nicht.
Danke für eure Hilfe.
sKy
Leider funktioniert es nicht
User since
2005-08-17
1420
Artikel
BenutzerIn
Ungetester Code-Schnipsel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $arrayIndex = 0;
my $blocks;
open(IN,'<',$inputFile)
or die "Fehler beim Oeffnen von $inputFile: $!\n";
while ( my $line = <IN>) {
chomp($line);
if ($line =~ /^#/) {
$arrayIndex++;
}
else {
push(@{$blocks->[$arrayIndex]}, $line);
}
}
close(IN);
...
Damit hast du dann einen Array, der pro Block wieder einen Array mit den Dateinnamen enthaelt.
User since
2003-08-04
14371
Artikel
ModeratorIn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @blocks;
{
local $/ = "#\n";
while(my $entry = <DATA>){
chomp $entry;
push @blocks,$entry;
}
@blocks = grep{$_}@blocks;
}
print Dumper(\@blocks);
__DATA__
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n2.txt
dlf951121.1230.n2.txt
dlf951121.1330.n4.txt
#
dlf951121.1200.n6.txt
dlf951121.1230.n4.txt
#
dlf951121.1200.n6.txt
dlf951121.1230.n4.txt
#
Edit: was
$/ bedeutet, kannst Du unter
perlvar nachschauen...\n\n
<!--EDIT|renee|1165334204-->
User since
2005-01-17
14770
Artikel
Admin1
Du musst das # als Datensatztrenner verwenden.
Also diu musst $RS bzw $/ anders setzen:
<--snipp-->
my @data;
open(DATEN, 'meine.daten');
{
local ($/) = "#\n";
@data=<DATEN>;
chomp(@data);
}
close(DATEN);
<--snipp-->
/EDIT: Oh, zu langsam. Grippe lässt zäh handeln. und chomp vergessen.\n\n
<!--EDIT|GwenDragon|1165335132-->
User since
2006-07-10
2611
Artikel
BenutzerIn
So dürfte es wohl einfach gehen:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $listfile='/pfdad/zur/datei.txt';
my @liste=();
open(FILE,'<', $listfile) or die "Konnte $listfile nicht oeffnen ($!)\n";
{
local $/="#\n";
push(@liste,[split(/\n/,$block)]) while(my $block=<FILE>);
}
close(FILE);
print Dumper(\@liste);
Danke fuer die prompte Antwort.
Leider gibt es ein Fehler in folgender Zeile:
push(@{$blocks->[$arrayIndex]}, $_);
und wie ruf ich eigentlich den array dann auf?
Mit
for (@blocks)
{
}
?
gruß sKy
User since
2003-08-04
14371
Artikel
ModeratorIn
Zu dem Fehler:
nepos hatte da ein
$line statt des
$_ stehen. Dann sollte es auch klappen...
Zu der Verwendung des Arrays:
Fast, es muss dann
@$blocks heißen (wenn Du nepos' Code nimmst). Bei meinem Code könnte man dann mit
for(@blocks) arbeiten....\n\n
<!--EDIT|renee|1165336579-->