Einzelnen Beitrag anzeigen

hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Gedcom-Datei parsen

  Alt 11. Dez 2014, 01:05
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!

Geändert von hansklok (11. Dez 2014 um 01:11 Uhr)
  Mit Zitat antworten Zitat