[PERL] bestand parsen

Pagina: 1
Acties:

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Hoi,

Ik wil een bestand analyseren en bepaalde data eruit halen. Ik dacht dat perl hier het meest geschikt voor was. Hier is een voorbeeld:

STREAM test;
blablabla;
blablabla;
blablabla;
INPUT;
INCLUDE all;
OUTPUT;
INCLUDE AAAA11 CCCC AAAA11 CCCC
AAAA11 CCCC AAAA11 CCCC AAAA11 CCCC;

END;

Het zijn de gegevens AAAA11 CCCC die ik moet hebben.
Deze gegevens hebben telkens dezelfde vorm, zie regex:
"[A-Z][A-Z][A-Z][A-Z][0-9][0-9] [A-Z][A-Z][A-Z][A-Z]"

Die INCLUDE in het begin en de ';' op het einde mogen niet inbegrepen worden. Ik weet ook niet hoeveel data er op één lijn zal bevinden. Iemand een idee hoe ik hieraan begin? Of in welke richting ik het beste zoek?

Ik heb met awk de data al tot dit kunnen beperken:

OUTPUT;
INCLUDE AAAA11 CCCC AAAA11 CCCC
AAAA11 CCCC AAAA11 CCCC AAAA11 CCCC;

END;

Zoals je al wel kunt zien, ben ik geen specialist in awk/sed/perl toestanden :)

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 02-10 22:42

CAPSLOCK2000

zie teletekst pagina 888

Als je handiger bent met AWK, gebruik dan dat. Voor dit probleem zal het niet veel uitmaken.
Hoe ik het zou doen:
Zoek de plek waar "INCLUDE" staat.
Gooi alles daarvoor weg.
Filter "INCLUDE " en "END; " uit je output.

This post is warranted for the full amount you paid me for it.


  • mbaltus
  • Registratie: Augustus 2004
  • Laatst online: 03-10 09:43
Zoiets:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
my $filename = "input.txt";
if (-e $filename) {
    open FILE,"<".$filename
        or die "Could not open '$filename': $!";
    while (<FILE>) {
        while (/([A-Z]{4}[0-9]{2} [A-Z]{4})/g) 
        {
            print "Found: $1\n";
                        # of wat je er ook mee wilt doen
        }
    }
    close FILE;
}
else {
    print "'$filename' does not exist!"
}

The trouble with doing something right the first time is that nobody appreciates how difficult it is


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Tnx, dit helpt mij al een heel eind op weg.

Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Deze code houdt rekening met het feit dat je je gegevens alleen tussen INCLUDE en ';' zoekt:
Perl:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl -w
use strict;

while (<>) {
    if (/^INCLUDE\s/../;\s*$/) {
        while (/([A-Z]{4}\d\d)\s+([A-Z]{4})/g) {
            my ($poco, $data) = ($1, $2);
            print "group1=$poco group2=$data\n";
        }
    }
}