Hallo,
ich schreibe heute, da ich mir von der Community meiner alten Lieblingsprogrammiersprache Hilfe erhoffe, die mir die Kollegen des aktuellen Frameworks
"Xojo" nicht geben können. An sich geht es um einen Algorithmus, deswegen ist die Plattform egal.
Was soll gepasst werden?
Eine Gedcom-Datei.
Gedcom ist eine Textdatei, ein Format mit der Endung ".ged", in der Ahnenforscher Ihre Daten zum Stammbaum sichern können. Sie enthält Hauptobjekte (INDI, FAM, SOUR, OBJ, NOTE), die mit durch eine "0" am Zeilenanfang gekennzeichnet sind, und Unterobjekte (z.B. DATE, EVEN, PLAC etc.), die mit "1" oder größer gekennzeichnet werden.
Ich möchte eine Anwendung erstellen, die bestehende Gedcom-Dateien einlesen kann, um so mit den Daten zu arbeiten.
Wie?
Mein Gedanke war folgender: Erst einmal die Datei einlesen. Zum Beispiel in eine Stringlist. Anschließend alle Zeilen durchlaufen. Sollte die Zeile ein Hauptobjekt kennzeichnen, so soll die Zeilennummer als Anfangszeile in einer Variable gespeichert werden. Nennen wir sie A. Anschließend geht die Schleife weiter, bis zum nächsten Hauptobjekt. Nun soll in Variable B die Zeilennummer vor dem neuen Hauptobjekt gespeichert werden (B = Zeilennummer -1)
Haben A und B einen Wert, sollen diese als
TPoint in einer Objektliste gespeichert werden.
Später, wenn die Springlist durchgelaufen ist, sollte man eine Liste haben, die alle Hauptobjekte, oder z.b. nur Personen enthält.
Für jeden Eintrag hat man nun die Start- und die Endzeilennummer und kann nun ebenfalls in einer Schleife jedes Objekt einzeln passen.
Darum gehts.
Was?
Ich suche Hilfe für den Algorithmus, der an sich sehr einfach sein sollte. Ich fände klasse, wenn man konzeptionelle Gedanken austauschen würde und/oder gemeinsam ein Strukturramm für diesen ersten Schritt zum einlesen einer Gedcom-Datei macht.
Wichtig: Das Xoxo-Framework bietet keine StringStreams.
Delphi-Quellcode:
procedure Parse(Gedcom As Stringlist)
var
AktuelleZeile: String;
AktuellesObjektName, AktuellesObjekt: String; // INDI, FAM, SOUR, OBJ, NOTE
i, Start, Ende: Integer;
istObjekt: Boolean = False;
begin
for i:=1 to Gedcom.Count do
begin
AktuelleZeile:= Gedcom.Items[i];
if LeftStr(AktuelleZeile, 1) = "0" then
AktuellesObjektName = Copy(AktuelleZeile, 3, 4);
AktuellesObjektName = Trim(AktuellesObjektName);
// solange diese nicht der Header ist
if AktuellesObjektName <> "HEAD" then
// Typ auslesen (INDI, FAM etc.)
AktuellesObjekt = RightStr(AktuelleZeile, 4);
AktuellesObjekt = Trim(AktuellesObjekt);
case AktuellesObjekt of
"INDI":
begin
if istObjekt then
B = i-1
istObjekt = False
// an dieser Stelle würde ich nun einem Point A und B zuweisen und das Objekt in einer Liste speichern
else
A = i;
istObjekt = True
end;
end;
end;
end;
end;
end;
end;
Das war so ein erster Gedankenansatz. Ich hoffe, ihr konntet mir folgen.
Eines ist noch zu bedenken: Das Ende einer Gedcom-Datei wird ebenfalls mit einer 0 am Beginn gekennzeichnet ("0 TRLR"). Sollte istObjekt = True sein, muss als B Gedcom.Count-1 gesetzt werden.
Ich freue mich über einen regen Austausch.
Gute Nacht!