Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8551[/thread]

Ein Problem mit der Extraktion von Textausschnitte: Perl->Manipulation von Texten



<< >> 7 entries, 1 page
sKy
 2006-12-05 17:44
#72252 #72252
User since
2006-12-05
10 articles
BenutzerIn
[default_avatar]
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
nepos
 2006-12-05 17:52
#72253 #72253
User since
2005-08-17
1420 articles
BenutzerIn
[Homepage] [default_avatar]
Ungetester Code-Schnipsel:
Code (perl): (dl )
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);

  # Neuer Block? Dann Index hochzaehlen
  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.
renee
 2006-12-05 17:55
#72254 #72254
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
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-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2006-12-05 18:02
#72255 #72255
User since
2005-01-17
14198 articles
Admin1
[Homepage]
user image
Du musst das # als Datensatztrenner verwenden.

Also diu musst $RS bzw $/ anders setzen:
<--snipp-->
Code: (dl )
1
2
3
4
5
6
7
8
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-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

topeg
 2006-12-05 18:10
#72256 #72256
User since
2006-07-10
2611 articles
BenutzerIn

user image
So dürfte es wohl einfach gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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);
guest Gast
 2006-12-05 18:27
#72257 #72257
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
renee
 2006-12-05 18:35
#72258 #72258
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
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-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 7 entries, 1 page



View all threads created 2006-12-05 17:44.