Script zur Extrahation von Informationen aus Dateien

Andreas Breslau andibre at gmx.de
Fr Sep 5 06:32:56 CEST 2008


Dr. Uwe Döbereiner wrote:

> Mir fehlt noch sehr viel mehr.
>
> Nämlich wenigstens _ein_ konkreter Vorschlag, wie so in etwa die 
> Fragestellung mit den jeweils vorgeschlagenen Sprachen angegangen 
> werden könnte. So einer Art Stub mit dem entsprechenden Code in der 
> empfohlenen Sprache.
>
(...)

> Liegt da vielleicht schon ein Lösungsansatz für die von Guido Grass zu 
> lösenden Aufgabe vor ?

Ich hatte Guido bereits meinen Lösungsansatz in perl geschickt.
Da ich jedoch kein Freund von angehängten Daten in Listen-Mails bin, und 
es außerdem eher Quick'n'Dirty ist und man nicht davon lernen sollte 
habe ich es hier nicht veröffentlicht.

Da du jedoch explizit danach fragst...

Unter Vernachlässigung der xml-hirarchie, die wie Guido schrieb 
eigentlich redundant ist bin ich von Daten dieser Form ausgegangen:

-------------------------------------------------------
# /home/andreas/Desktop/xml/xmldata/test1.txt
 <eudract-number>t1</eudract-number>
<phase-one>11</phase-one>
  <phase-two>12</phase-two>
  <phase-three>13</phase-three>
  <phase-four>14</phase-four>
  <in-member-state>1state</in-member-state>
  <in-european-community>1euro</in-european-community>
  <in-whole-trial>1whole</in-whole-trial>
-------------------------------------------------------
# /home/andreas/Desktop/xml/xmldata/test2.txt
 <eudract-number>t2</eudract-number>
<phase-one>21</phase-one>
  <phase-two>22</phase-two>
  <phase-three>23</phase-three>
  <phase-four>24</phase-four>
  <in-member-state>2state</in-member-state>
  <in-european-community>2euro</in-european-community>
  <in-whole-trial>2whole</in-whole-trial>
-------------------------------------------------------

Dazu folgendes perl script:

-------------------------------------------------------
#!/usr/bin/perl

use strict;

my $line=undef;
my @format=undef;
my $PATH=undef;
my $OUTPUT=undef;

# config einlesen
open(CONF, "xml.config") or die "Error reading config: $!\n";
while($line =<CONF>)    {
    $line =~ s/\n$//;
    (my $key, my $value)=split(/:/, $line);
    if($key eq "PATH")    {
        $PATH=$value;
    }
    elsif($key eq "OUTPUT")    {
        $OUTPUT=$value;
    }
    elsif($key eq "FORMAT")    {
        @format=split(/\t/, $value);
    }
    else    {
        # noch nicht vorgesehen
    }
}
close(CONF);

# alle Files im Quellordner werden verarbeitet. dabei wird nicht getestet.
opendir(IMD, $PATH) or die "Cannot open directory: $!\n";
my @files= readdir(IMD);
closedir(IMD);

#Outputfile vorbereiten
open(OUT, "> $OUTPUT") or die "Error opening file $OUTPUT for writing: 
$!\n";

# schleife über alle dateien
foreach my $file (@files)    {
    if($file eq "." or $file eq "..")    { # nicht ganz alle dateien
        # do nothing
    }
    else    {
        my $in=undef;
        open(FILE, "$PATH/$file") or die "Error reading file $file:$!\n";
        while($line=<FILE>)    {
            $in.=$line;
        }
       
        my %xml=undef; # hashs sind praktisch, siehe unten.

# die regexp verarbeitet alles in der form <TAG>TEXT</TAG>
        while($in=~ m/<([^>]+)>([^<]+)<\/\1>/g){

            $xml{$1}=$2; # hierfür sind hashs praktisch
        }
       
        my $out=undef;
        foreach my $elem (@format)    {
            $out.= $xml{$elem}. "\t"; # und hierfür
        }
        $out =~ s/\t$/\n/;
        print OUT $out;
    }
}
-------------------------------------------------------

Dazu gibts ne kleine config datei:

-------------------------------------------------------
#/home/andreas/Desktop/xml/xml.config
PATH:/home/andreas/Desktop/xml/xmldata
FORMAT:eudract-number    in-member-state    in-european-community    
phase-one    phase-four    phase-three    phase-two    in-whole-trial
OUTPUT:/home/andreas/Desktop/xml/liste.txt
-------------------------------------------------------

Aber wie gesagt, nichts tolles, aber tut.

Gruß Andreas