Q: Text parsen
am 03.07.2006 12:02:37 von Reinhard Pagitsch
Hallo allerseit,
Ich habe Text Dateien folgenden Inhalts:
------------- sample 1 --------------
Modifications:
New features:
ToDo 4650:
Some text
Bug Fix:
------------- sample 1 end ----------
------------- sample 2 --------------
Modifications: some text
some more text
New features:
ToDo 4650:
Some text
Bug Fix:
========
fixed bugs
------------- sample 2 end ----------
Was ich nun tun möchte den Text zwischen z.B. Modifications: und New
features: herauszuholen. Die Erschwernis ist das die Reihenfolge, so wie
ich das hier dargestellt habe beliebig sein kann. Auch kann z.B. die
Überschrift für Bug Fix unterschiedlich sein (Bugfix :, bug fixed:, ...)
Den Text lese ich mittels open(FH, "datei"); @lines=; ein.
Hat vielleicht jemand eine Idee wie ich das am Einfachsten lösen könnte?
Ich hoffe ich habe mich gut genug ausgedrückt.
Danke und eine schöne Woche,
Reinhard
--
Re: Q: Text parsen
am 03.07.2006 12:31:31 von Daniel Fischer
Reinhard Pagitsch!
> Was ich nun tun möchte den Text zwischen z.B. Modifications: und New
> features: herauszuholen. Die Erschwernis ist das die Reihenfolge, so wie
> ich das hier dargestellt habe beliebig sein kann. Auch kann z.B. die
> Überschrift für Bug Fix unterschiedlich sein (Bugfix :, bug fixed:, ...)
im Prinzip wuerde ich das ungefaehr so anpacken:
%hurz = ();
$type = 'prolog';
while(<>) {
if(s/^([^ ].*)://) {
$type = $1;
}
$hurz{$type} .= $_;
}
print $hurz{'Modifications'};
Das ist ein eher blauäugier Ansatz, ich weiss halt auch nicht wirklich
genug über das Format. Die unterschiedlichen Überschriften sind hier
auch noch nicht berücksichtigt. Aber vielleicht kannst Du damit ja schon
was anfangen.
Gruß
Daniel
Re: Q: Text parsen
am 03.07.2006 13:01:40 von Reinhard Pagitsch
Hallo Daniel,
Daniel Fischer wrote:
> Reinhard Pagitsch!
>
>> Was ich nun tun möchte den Text zwischen z.B. Modifications: und New
>> features: herauszuholen. Die Erschwernis ist das die Reihenfolge, so wie
>> ich das hier dargestellt habe beliebig sein kann. Auch kann z.B. die
>> Überschrift für Bug Fix unterschiedlich sein (Bugfix :, bug fixed:, ...)
>
> im Prinzip wuerde ich das ungefaehr so anpacken:
>
> %hurz = ();
> $type = 'prolog';
> while(<>) {
> if(s/^([^ ].*)://) {
> $type = $1;
> }
> $hurz{$type} .= $_;
> }
> print $hurz{'Modifications'};
>
Der Ansatz ist schon mal ganz gut. Dummer weise kann es auch folgendes
geben:
----------- sample --------
New features:
Modifications:
Rollback to version 20060306
Bug Fix:
FFD_4899_Isis:Changed_naming_convention_for_DocClasses_is_un acceptable_for_current_customer
--------- sample end --------
man sieht folgendes:
für "New features:" gibt es keinen Eintrag
für "Modifications:" gibt es den Eintrag "Rollback to version 20060306"
aber für "Bug Fix:" gibt es dann
FFD_4899_Isis:Changed_naming_convention_for_DocClasses_is_un acceptable_for_current_customer
Bei Deinem Beispiel ist somit auch "FFD_4899_Isis:" eine Überschrift.
> Das ist ein eher blauäugier Ansatz, ich weiss halt auch nicht wirklich
> genug über das Format. Die unterschiedlichen Überschriften sind hier
Was meinst Du mit Format? Das ganze sind einfache Textdateien auf
Windows erstellt.
Aber wenn Du willst kann ich Dir mal so eine Datei per PM als Attachment
schicken.
> auch noch nicht berücksichtigt. Aber vielleicht kannst Du damit ja schon
> was anfangen.
>
>
> Gruß
> Daniel
regards,
Reinhard
Re: Q: Text parsen
am 03.07.2006 13:40:32 von Daniel Fischer
Reinhard Pagitsch!
> Was meinst Du mit Format? Das ganze sind einfache Textdateien auf
> Windows erstellt.
Das wusste ich nicht, hätte ja auch von einem Bugtracker kommen können
oder ähnliches.
Der Punkt ist halt, dass ich hier nur Vermutungen anstellen kann, wie die
Files aussehen. Bei meinem letzten Beispiel wusste ich noch nicht, dass
Doppelpunkte im Text vorkommen können usw.
Davon ausgehend, dass vor einer Überschrift immer eine Leerzeile kommt
und in den Einträgen keine enthalten sind, die von Zeilen mit
Doppelpunkten gefolgt sind, könnte ich es z.B. so abändern:
%hurz = ();
$type = undef;
while(<>) {
if(/^$/) {
$type = undef;
} elsif(!$type && s/^([^ ].*)://) {
$type = $1;
}
$hurz{$type} .= $_;
}
Wenn das immer noch nicht genügt, würde ich Dir vorschlagen, die
erlaubten Überschriften fest zu verdrahten. Mit Betonung auf "Dir",
das hier ist ja keine Hausaufgabengruppe ;-)
Gruß
Daniel
Re: Q: Text parsen
am 03.07.2006 13:46:35 von frank
Reinhard Pagitsch wrote:
> Bei Deinem Beispiel ist somit auch "FFD_4899_Isis:" eine Überschrift.
>
>> Das ist ein eher blauäugier Ansatz, ich weiss halt auch nicht wirklich
>> genug über das Format. Die unterschiedlichen Überschriften sind hier
>
> Was meinst Du mit Format? Das ganze sind einfache Textdateien auf
> Windows erstellt.
Irgendwie muss mal jemand festgelegt haben (oder festlegen), wie ein
Computer erkennen können soll, was eine Überschrift ist. Diese
Festlegung beschreibt "das Format" der Dateien.
vielleicht reicht ja schon
- if(s/^([^ ].*)://) {
+ if(s/^([^ ].*):$//) {
das heisst: Alle Zeilen, die mit einem Doppelpunkt enden, sind eine
Überschrift.
Gruß, Frank
--
Arguing that cdbs is good because make is a least common denominator
language in Debian is like arguing that we should do GRs in iambic
pentameter because English is the lingua franca. :) vorlon
Re: Q: Text parsen
am 05.07.2006 09:05:04 von Reinhard Pagitsch
Hallo Daniel
Daniel Fischer wrote:
> Reinhard Pagitsch!
>
>> Was meinst Du mit Format? Das ganze sind einfache Textdateien auf
>> Windows erstellt.
>
> Das wusste ich nicht, hätte ja auch von einem Bugtracker kommen können
> oder ähnliches.
So was ähnliches, aber leider nicht einheitlich. Ich hab das jetzt
anders gelöst:
Ich lese jede Datei in einen String, suche nach den Überschriften
(Keywords) und ersetze sie mit ##Keyword.
Dan verwende ich Text::ParseWords und bekomme dann alles schön in ein
Array das ich dann weiter auswerte.
Ist viel einfacher als wenn ich für jeden Fall einen eigenen Parser
schreibe.
regards,
Reinhard