webForumDet fria alternativet

Filhantering

4 svar · 300 visningar · startad av dd

ddMedlem sedan aug. 200121 inlägg
#1

Hej, nu behöver jag lite hjälp i perl som jag inte förstår mycket av...

Jag hämtar information ur följande fil med hjälp av:

open (FILE,"<..minfil.txt");
@fildata=<FILE>;
foreach $rad(@fildata)
{
print $rad."<br>";
}

close (FILE);

Den skriver ut alla och avslutar raden med nyrad.

Problemet är att jag inte vill att den ska skriva ut hela raden, jag vill att den avslutar varje utskrift vid tex ett tecken eller ord.

Namn: Förnamn Efternamn Adress: gatan 13

om jag vill att den ska avsluta läsning innan Adress, hur gör jag då?

JojoxxMedlem sedan juni 20004 308 inlägg
#2

Det beror på. Vad skall ske om inte " Adress:" finns exempelvis? Men det kanske det alltid gör...

foreach $rad(@fildata)
{
	@rad=($rad=~m/(.*) Adress:/);
	print $rad[0]."<br>";
}

Eller om du inte gillar RegExp;

foreach $rad(@fildata)
{
	print substr($rad,0,index($rad," Adress:"))."<br>";
}
ddMedlem sedan aug. 200121 inlägg
#3

Tack tack

har suttit och klurat ut det hela med split men detta fungerar mycket bättre.

Hur skulle man göra om jag låt säga bara vill plocka ut de personer som tex bor på "webbvägen", dvs söka rätt och lista de de rader i textfilen som innehåller webbvägen.

har suttit en del med php och mysql och det här med perl och textfiler var ingen lek...

JojoxxMedlem sedan juni 20004 308 inlägg
#4

Ett litet exempel:

foreach $rad(@fildata)
{
	chomp $rad;
	my (%field);
	my @f=split(/(\w+): /,$rad);
	for(my $n=1;$n<$#f;$n+=2){ $field{$f[$n]}=$f[$n+1]; }
	next unless ($field{'Adress'}=~/webbgatan/i);
	print $field{'Namn'}."<br>";
}

Här läser vi alltså av varje rad till en s.k. hash där vi sedan jämför fältet "Adress" med "webbgatan".

HansenMedlem sedan aug. 2000374 inlägg
#5

Hej,

En annan variant :)

Fältnamn kan innehålla alla tecken utom kolon. Den tar inte med mellanslag som är i början eller slutet av värdet.

#!/usr/bin/perl

use strict;
use warnings;

use IO::File;

my $fh = new IO::File;

unless ( $fh->open( "flat.txt", O_RDONLY ) ) {
    die( "Failed to open file: flat.txt. Reason: ", $! );
}

my @matches = ();

while ( my $line = $fh->getline ) {

    my $record = {};

    while ( $line =~ m/ (\S+): \s+ ( .*? (?: (?=\s+\S+:\s+) | $ ) ) /gx ) {
        $record->{ lc($1) } = $2;
    }

    if ( $record->{adress} and $record->{adress} =~ /webbvägen/i ) {
        push( @matches, $record );
    }
}

unless ( $fh->close ) {
    die( "Failed to close file: flat.txt. Reason: ", $! );
}

printf( "Hittade %s matchande träffar\n\n", scalar(@matches) || "inga" );

while ( my $record = shift(@matches) ) {
    printf("%s har adressen %s.\n", $record->{namn}, $record->{adress} );
}

__END__
Namn: Christian Hansen Ort: Malmö Adress: Annanvägen 6 A
Namn: D D Adress: Webbvägen 43 B
Namn: Jojoxx Adress: Webbvägen 1 A
134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)