Schrift
[thread]8223[/thread]

Werte zwischen START und ENDE in 2D-Array schr...



<< >> 6 Einträge, 1 Seite
Gast Gast
 2006-08-08 11:51
#68688 #68688
Hallo! Ein Perl-Neuling braucht mal Hilfe.

Ich habe einen Text. Der sieht so aus:

Code: (dl )
1
2
3
4
5
START 
Beschreibung1|Wert1|
Beschreibung2|Wert2|
Beschreibung3|Wert3|
ENDE


Ich möchte nun das alles zwischen START und ENDE steht, in ein mehrdimensionales Array schreiben. (Möchte dieses Array dann später durchsuchen können.)

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
#!/usr/bin/perl -w

my @datei = ('/home/user/perl/honky.txt');
my $z=0;
my $irgendwas;

foreach $irgendwas (@datei)
{

while(@datei)
{
open (DATEI, "$irgendwas") || die ("konnte die Datei nicht oeffnen. Fehler: $!");
@eingabe=<DATEI>;
close DATEI;
my $z=0;
if( $irgendwas =~ /START/ )
{
$z=1;
$elem=$irgendwas;
}
if( $irgendwas =~ /ENDE/ )
{
$z=0;
$tabelle[$i]=$elem;
$i++;
}
if($z==1)
{
$elem=$elem.$_;
}
}

open (OUT, ">ausgabe.txt") || die ("konnte die Datei nicht oeffnen. Fehler: $!");

print OUT @eingabe;
close OUT;
}

So funktionert das Skript nicht.
vayu
 2006-08-08 12:31
#68689 #68689
User since
2005-01-13
782 Artikel
BenutzerIn
[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
#!/usr/bin/perl

use strict;
use warnings;

open(FILE, "<", "test.txt") or die $!;

my %hash = ();

while(<FILE>) {
chomp $_;
if($_ =~ /^(.*)\|(.*)\|$/) {
$hash{$1} = $2;
}
}

foreach my $key (keys %hash) {
print "Wert an Stelle ".$key." => ". $hash{$key}."\n";
}

close FILE;


NICHT getestet

so könntest das machen.

habe aber einen hash anstatt einem merhdimensionalen array genommen.

in den perl-tags wird komischerweise $1 und $2 durch kryptische zeichen erstetzrt?\n\n

<!--EDIT|vayu|1155027339-->
renee
 2006-08-08 12:43
#68690 #68690
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Als Anregung:
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
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $string = q~START
Beschreibung1|Wert1|
Beschreibung2|Wert2|
Beschreibung3|Wert3|
ENDE
START
Beschreibung4|Wert4|
Beschreibung5|Wert5|
Beschreibung6|Wert6|
ENDE~;

my @parts = $string =~ /START(.*?)ENDE/sg;

my @array;

for my $part(@parts){
$part =~ s/\n//g;
while($part =~ /(.*?)\|(.*?)\|/g){
push(@array,[$1,$2]);
}
}

print Dumper(\@array);
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/
Ronnie
 2006-08-08 12:50
#68691 #68691
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@vayu: Es ist empfehlenswert while statt for zu verwenden, da du so nicht die ganze Datei in ein Array slurpen musst - was gerade bei sehr großen Dateien problematisch sein kann.

Bei dem Beispiel bietet es sich auch an den Flip-Flop Operator zu verwenden um nur zwischen START und ENDE zu matchen:
Code: (dl )
1
2
3
4
5
while (<DATA>) {
if (/START/ .. /ENDE/ ) {
$set{$1} = $2 if /^(.*)\|(.*)\|.*$/;
}
}
vayu
 2006-08-08 12:55
#68692 #68692
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
args ... da sollte eigentlich auch while stehen ... ich ändere das.

Danke Ronnie
Strat
 2006-08-08 16:48
#68693 #68693
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
beim while solltest du auch noch das $_ bei while local'isieren... sonst ueberschreibst du dir eventuell ein $_ von ausserhalb...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 6 Einträge, 1 Seite



View all threads created 2006-08-08 11:51.