Konfigurierbarer Parser?

Moin Experten,

ich stehe zur Zeit des öfteren vor der Aufgabe, Exports aus diversen Programmen auszuwerten, zu bearbeiten und als Import in andere Programme aufzuarbeiten.

Da jeder der Hersteller ein ganz eigenes Süppchen beim Exportformat kocht, ist das meist eine Schweine-Arbeit: Öffnen mit Textverarbeitung -> Zeilenumbrüche löschen -> Öffnen mit Tabellenkalkulation -> Aufteilen in Spalten -> Überflüssiges löschen -> Batchverarbeitung (z.B. DNS-Abgleich) -> Import in Zielprogramm

Meine Frage: gibt es irgendetwas, womit man sich solche stupiden Arbeiten erleichtern kann? Ich habe mal ein Semester Compilerbau gemacht und mit schwirren noch so Begriffe wie Lexer und Parser durch den Kopf - aber das ist fast 30 Jahre her! :wink:

Ich bräuchte im Prinzip eine Software, der ich z.B. „sagen“ könnte: „Ein Datensatz in der Ausgangsdatei ist von „[“ und „]“ eingeschlossen und die relevanten Daten werden mit „IP=“ und „Name=“ eingeleitet. Vergiss alles andere und schreibe mir nur diese Daten pro Datensatz in eine neue Datei. Verwende das CSV-Format“. *träum*

…und wenn wir schon bei Träumen sind: toll wäre es, wenn man zur Bedienung dieser imaginären(?) Software nicht vorher drei Jahre lang auf einem einsamen Berggipfel das 30.000seitige Handbuch auswendig lernen müsste. *grins*

Gruß
Stefan

ich stehe zur Zeit des öfteren vor der Aufgabe, Exports aus
diversen Programmen auszuwerten, zu bearbeiten und als Import
in andere Programme aufzuarbeiten.

Hallo Stefan,

es gab mal eine recht verbreitete Software genau zu diesem Zweck - zum Einlesen der Listenausdrucke vom Mainframes. Die hiess so ähnlich wie „Compass“, aber genauer erinnere ich mich nicht mehr, und ich finde auch nichts mehr drüber.

Einen konfigurierbaren Parser habe ich schon einmal erstellt, für das Lesen der Ausgabe von CAD/CAM-Systemen für verschiedene Werkzeugmaschinen. Der Zweck war: a) nur noch einen einzigen Preprozessor zu liefern und b) die Techniker meines Kunden konnten den Preprozessor selbst entsprechend anpassen, ohne Assembler und Compiler zu benutzen. Einen geeigneten Compiler-Compiler habe ich natürlich mitgeliefert.

Aber: eine Arbeitsersparnis ergibt sich damit zunächst kaum. Du must ja dem Preprozessor auch erst erklären, was er wo findet und wie es formatiert ist. Der Vorteil ist nur, wenn das Problem gelöst ist, hat der Anwender nichts mehr damit zu tun, er ruft einfach den für „B+W Drehbank“ konfigurierten PreProzessor aus. Nebenbei bemerkt, entsprechend konfigurierbare PostProzessoren gab es lange vorher, die sind auch einfacher.

Falls du trotzdem Interesse hast und ein Jahr Zeit und einen hübschen Entwicklungsetat, melde dich.

Gruss Reinhard

Hallo,

ich stehe zur Zeit des öfteren vor der Aufgabe, Exports aus
diversen Programmen auszuwerten, zu bearbeiten und als Import
in andere Programme aufzuarbeiten.

Meine Frage: gibt es irgendetwas, womit man sich solche
stupiden Arbeiten erleichtern kann? Ich habe mal ein Semester
Compilerbau gemacht und mit schwirren noch so Begriffe wie
Lexer und Parser durch den Kopf - aber das ist fast 30 Jahre
her! :wink:

Ich bräuchte im Prinzip eine Software, der ich z.B. „sagen“
könnte: „Ein Datensatz in der Ausgangsdatei ist von „[“ und
„]“ eingeschlossen und die relevanten Daten werden mit „IP=“
und „Name=“ eingeleitet. Vergiss alles andere und schreibe mir
nur diese Daten pro Datensatz in eine neue Datei. Verwende das
CSV-Format“. *träum*

ist das nicht genau die Aufgabe für reguläre Ausdrücke?

Ich würde mir einen Editor besorgen, der über reguläre Ausdrücke suchen und erstzen kann und die Dateien da „reinwerfen“

Greetinx
Christian
http://www.netz-coaching.de

Hallo,

ist das nicht genau die Aufgabe für reguläre Ausdrücke?

Solange die Daten alle z.B. Zeilenweise stehen, sind reguläre Ausdrücke dafür perfekt. Wenn es verschachtelte Ausdrücke sind, wird das schnell fast unmöglich bis ganz unmöglich.

Ich würde mir einen Editor besorgen, der über reguläre
Ausdrücke suchen und erstzen kann und die Dateien da
„reinwerfen“

Oder, wenn man es öfter mit der gleichen Konvertierung zu tun hat: Perl. Die Sprache ist dafür gemacht.

Grüße,
Moritz

Hallo,

ich habe solche Sachen früher immer in kleinen Basic-Programmen gelöst. Das Grundgerüst bleibt ja immer gleich, also Quelldatei öffnen, Einlesen von x-Zeichen/bis Zeichen y/y-Zeilen, dann mit Left$, Right$ Mid$-Konstrukten die gewünschten Elemente isolieren und dann nach vorgegebener Syntax daraus einen Zieldatensatz häkeln, der in eine Zieldatei geschrieben wird. Mit etwas Programmierkenntnissen geht die Anpassung auf mehr oder weniger gut strukturierte Daten sehr schnell.

Oft noch schneller war der Einsatz eines auch spaltenweise arbeitenden Editors wie qedit. Wenn die Datensätze zeilen- und spaltenweise orientiert sind, kann man so wunderbar alle nicht benötigten Spalten ganz schnell und bequem löschen und ggf neue Spalten einfügen und automatisch mit Inhalt füllen.

Gruß vom Wiz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

Solange die Daten alle z.B. Zeilenweise stehen, sind reguläre
Ausdrücke dafür perfekt. Wenn es verschachtelte Ausdrücke
sind, wird das schnell fast unmöglich bis ganz unmöglich.

Verschachtelt wohl nicht, aber auch nicht zeilenweise…

Hier mal ein Beispiel von einem extrem aufwändig zu transformierenden Export:

[Subnet : "XXX.YYY.ZZZ.0(xxxxxxxx)"]
 Subnet Address = XXX.YYY.ZZZ.0
 Subnet Mask = 255.255.255.0
 Lease Time = 259200
 Config Options = 00 00 00 00 03 04 C0 A8 C8 01 42 0E 31 39 32 2E 31 36 \
 38 2E 32 30 30 2E 37 31
 Domain Name = blabla.blublub.domain
 Subnet Type = 0
 Comment = blablabluber

[IP Address Configuration : "XXX\_YYY\_ZZZ\_228.blabla.blublub.domain"]
 IP Address Number = XXX.YYY.ZZZ.228
 Assignment Type = 128
 MAC Address = ff xx xx xx xx xx xx
 Client Identifier = 01 xx xx xx xx xx xx

[IP Address Configuration : "XXX\_YYY\_ZZZ\_81.blabla.blublub.domain"]
 IP Address Number = XXX.YYY.ZZZ.81
 Assignment Type = 8
 Host Name = Kyo38725
 Last Used = 1147349009000
 MAC Address = 1 xx xx xx xx xx xx
 Client Identifier = 01 xx xx xx xx xx xx
 Comment = blablabluber

Es gibt ausser „Subnet“ und „IP Address Configuration“ auch noch andere Datensätze, aber die nur mal als Beispiel.

Die Aufgabe wäre jetzt:
Extrahiere aus allen Datensätzen, bei denen der Header mit „IP Address Configuration“ anfängt, jeweils „IP Address Number“ und „MAC Address“ und schreibe dies in eine CSV-Datei.

Im Augenblick löse ich das mit einer Kombination von WinWord und Excel und einer Handvoll Makros. Das ist aber erstens nicht sonderlich elegant und zweitens fast unmöglich vernünftig zu dokumentieren.

Oder, wenn man es öfter mit der gleichen Konvertierung zu tun
hat: Perl. Die Sprache ist dafür gemacht.

Hmmmm, Perl steht auch noch auf meiner Liste „Dinge mit denen ich mich unbedingt beschäftigen muss, wenn ich irgendwann mal Zeit finde“

Gruß
Stefan

Hi,

ich habe solche Sachen früher immer in kleinen
Basic-Programmen gelöst.

Jo, ich mit Turbo-Pascal (ja richtig, dem alten DOS-Schrubber *g*. Das ist leider die einzige Programmiersprache die ich noch einigermaßen beherrsche)

Zwei Probleme dabei: Flexibilität und Dokumentation

Bei jeder Änderung des Export-Formats muss eine Software umgeschrieben werden und eine Dokumentation nachgeführt werden.

Mir schwebte halt mehr so etwas „lesbares“ wie eine SQL-Abfrage vor bzw. eine „getunte“ Version des Excel-Datenimport-Assistenten.

Gruß
Stefan

Hi,

Falls du trotzdem Interesse hast und ein Jahr Zeit und einen
hübschen Entwicklungsetat, melde dich.

Muaahahahahaha! Das einzige, was ich habe ist Interesse.
Wenn ich einen Etat hätte, würde ich mir einen 1€-Sklaven holen, der das händisch macht! *duck*

Nene, ich bin nur der normale arme SysAdm, der versucht sich eine Arbeit zu erleichtern. :wink:

Gruß
Stefan

Hallo,

Verschachtelt wohl nicht, aber auch nicht zeilenweise…

[Beispiel]

Sowas ist kein Problem mit perl, und eine Sache von vielleicht 30 Zeilen Code - wenn man es lang macht.

Hmmmm, Perl steht auch noch auf meiner Liste „Dinge mit denen
ich mich unbedingt beschäftigen muss, wenn ich irgendwann mal
Zeit finde“

Vielleicht ist das jetzt ein guter Grund, Zeit zu finden :wink:

Ein Parsergenerator oder sowas ist IMHO overkill, obwohls auch da einiges an kostenlosen Dingen gibt (lex, yacc, bison).

Grüße,
Moritz

Hallo,

Verschachtelt wohl nicht, aber auch nicht zeilenweise…

awk waere fuer Zeilen noch eine Empfehlung gewesen. Fuer Bloecke geht es auch, aber nicht so gut. awk ist der kleine Bruder von Perl. Fuer das Beispiel tut es vielleicht auch ein Unix-Shell-Script (Shell ist auch ein kleiner Bruder von Perl, aber das kann man schlechter lesen. Noch schlechter.)

Hier mal ein Beispiel von einem extrem aufwändig zu
transformierenden Export:

> [Zeug]

Fast waere ich versucht gewesen… mal sehen, wenn ich Zeit und Lust hab.

Im Augenblick löse ich das mit einer Kombination von WinWord
und Excel und einer Handvoll Makros.

Oh Gott, mir wird schlecht.

Hmmmm, Perl steht auch noch auf meiner Liste „Dinge mit denen
ich mich unbedingt beschäftigen muss, wenn ich irgendwann mal
Zeit finde“

Die Zeit ist reif. Du bist SysAdmin und arm. Das sind die besten Vorraussetzungen fuer Perl. (Okay, Du schreibst unten noch, dass Du normal bist, aber zwei von drei Treffern reicht als Qualifikation.)

Gruss vom Frank.

> > [Zeug]

Fast waere ich versucht gewesen… mal sehen, wenn ich Zeit
und Lust hab.

Vielleicht so ungefaehr:

(0) frank@harbard [~] % cat foo.dat 
[Subnet : "XXX.YYY.ZZZ.0(xxxxxxxx)"]
 Subnet Address = XXX.YYY.ZZZ.0
 Subnet Mask = 255.255.255.0
 Lease Time = 259200
 Config Options = 00 00 00 00 03 04 C0 A8 C8 01 42 0E 31 39 32 2E 31 36 \
 38 2E 32 30 30 2E 37 31
 Domain Name = blabla.blublub.domain
 Subnet Type = 0
 Comment = blablabluber

[IP Address Configuration : "XXX\_YYY\_ZZZ\_228.blabla.blublub.domain"]
 IP Address Number = XXX.YYY.ZZZ.228
 Assignment Type = 128
 MAC Address = ff xx xx xx xx xx xx
 Client Identifier = 01 xx xx xx xx xx xx

[IP Address Configuration : "XXX\_YYY\_ZZZ\_81.blabla.blublub.domain"]
 IP Address Number = XXX.YYY.ZZZ.81
 Assignment Type = 8
 Host Name = Kyo38725
 Last Used = 1147349009000
 MAC Address = 1 xx xx xx xx xx xx
 Client Identifier = 01 xx xx xx xx xx xx
 Comment = blablabluber
(0) frank@harbard [~] % cat foo.pl 
#!/usr/bin/perl

use strict;
use warnings;

open my $file, ')
{
 next if ( /^$/ );
 chomp;
 if ( /^\[IP Address Configuration :/ )
 {
 while ()
 {
 next if ( /^$/ );
 last if ( /^\[/ );
 (my $key, my $value) = split /=/;
 $key =~ s/^\s+|\s+$//g;
 $value =~ s/^\s+|\s+$//g;
 print "$value;" if ($key eq "IP Address Number");
 print "$value\n" if ($key eq "MAC Address");
 }
 exit 0 if ( eof $file );
 redo
 }
}
(0) frank@harbard [~] % ./foo.pl 
XXX.YYY.ZZZ.228;ff xx xx xx xx xx xx
XXX.YYY.ZZZ.81;1 xx xx xx xx xx xx
(0) frank@harbard [~] %

Ist ziemlich anfaellig gegenueber der Reihenfolge (eg. MAC-ID vor IP#) und fuer ein Perl-Script viel zu lesbar.

HTH,
Gruss vom Frank.

1 Like

Hallo Stefan,

Hier mal ein Beispiel von einem extrem aufwändig zu
transformierenden Export:

Hmmmm, Perl steht auch noch auf meiner Liste „Dinge mit denen
ich mich unbedingt beschäftigen muss, wenn ich irgendwann mal
Zeit finde“

Da sich nun Frank & Moritz damit befasst haben,
muss ich auch mal meinen Senf dazuliefern :wink:

Das Ganze ist ein sehr simples Problem, welches
(in Perl) wahrscheinlich Heerschaaren von
Administratoren öfter zu lösen haben.

Hier mein first shot:

 use Config::IniFiles; # dieses Modul gibts schon
 use strict;
 my $filename = $ARGV[0] || 'beispiel.ini'; # hier den Dateinamen

 my $cfg = Config::IniFiles-\>new(-allowcontinue =\> 1, -file =\> $filename);
 my @sections = $cfg-\>Sections();

 # Es gibt ausser "Subnet" und "IP Address Configuration" 
 # auch noch andere Datensätze, 

 for ( @sections ) {
 # Extrahiere aus allen Datensätzen, bei denen der Header 
 # mit "IP Address Configuration" anfängt, jeweils 
 # "IP Address Number" und "MAC Address" und schreibe 
 # dies in eine CSV-Datei.
 #
 if (/ **IP Address Configuration** /) {
 my $ipa = $cfg-\>val($\_, 'IP Address Number'); 
 my $mac = $cfg-\>val($\_, 'MAC Address'); 
 print "\"[$\_]\", \"$ipa\", \"$mac\"\n"; # CSV-Zeile
 }
 }

Du siehst, das Meiste ist „# Kommentar“, die
Programmlogik ist minimal. Die Ausgabezeile
‚print‘ liefert rudimentäres CSV,

"[IP Address Configuration : "XXX\_YYY\_ZZZ\_228.blabla.blublub.domain"]", "XXX.YYY.ZZZ.228", "ff xx xx xx xx xx xx"
"[IP Address Configuration : "XXX\_YYY\_ZZZ\_81.blabla.blublub.domain"]", "XXX.YYY.ZZZ.81", "1 xx xx xx xx xx xx"

Du musst das dann halt so umschreiben,
wie Du es brauchst.

Unter den Block ‚if (/IP Address Configuration/)‘
schreibst Du noch weitere Blöcke, welche Du auswerten
möchtest.

So weit erstmal …

Grüße

CMБ

1 Like

Vielen Dank Euch allen!

Perl also…

Wo ich mich als alter „Das-kann-man-alles-mit-einer-DOS-Batch-machen“-Fanatiker doch grade erst in VBS einarbeite…*seufz*

Irgendwelche Empfehlungen bzgl. des Selbststudiums von Perl? HP’s mit guten Einführungen?

Gruß
Stefan
*sternchenstreu*

Re^6: Goil! Danke :smile:
Hallo Stefan,

Perl also…
Wo ich mich als alter
„Das-kann-man-alles-mit-einer-DOS-Batch-machen“-Fanatiker doch
grade erst in VBS einarbeite…*seufz*

Nicht unbedingt. Ich denke mal, wenn man
die richtigen Tools findet, die schon
irgendwie publiziert sind, kann man
das auch ohne weiteres in seiner
machen.

Perl hat nämlich schon seine Ecken und Kanten,
es ist vor allem eine „harte“ Programmiersprache
(imho), d.h. sie verzeiht „mangelnde Kompetenz“
eher nicht. Was bedeutet: Du kommst nicht weiter,
wenn Du Dich nicht wirklich intensiv damit be-
fasst (am Anfang).

Irgendwelche Empfehlungen bzgl. des Selbststudiums von Perl?
HP’s mit guten Einführungen?

OK, erstmal Perl für Windows (MSI) runterziehen:
http://www.activestate.com/Products/Download/Downloa…

Dann hast Du einen schönen Paketmanager. Um mein
Beispiel zum laufen zu bekommen, müsstest Du
nach der Installation ein DOS-Fenster öffnen
und

 C\> ppm install Config-IniFiles

ausführen. Dann kennt Dein Rechner dieses Modul,
welches neben über 100 Millionen
anderen auf http://www.cpan.org liegt.

Als Editor würde ich stark SciTE vom
Scintilla-Project empfehlen, da hast
Du bereits eine simple Entwicklungsumgebung:
http://prdownloads.sourceforge.net/scintilla/scite16…
(im Explorer Endung .pl mit Scite verknüpfen,
später: Programmlauf mit F5)

Zum Lernen würde ich mal eher mit einfacher
Kost anfangen, z.B. mit dem Lama-Buch:
ISBN: 3897214342 Buch anschauen
welches ganz gut und verständlich geschrieben ist.

Aber wie gesagt, das kann sich hinziehen.
Du musst halt einfach damit anfangen.

Grüße

CMБ