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