Frage

Kennt jemand eine gute Klasse in .ged Dateien zu lesen

Gedcom ist ein Dateiformat, das verwendet wird, genealogische Informationen zu speichern.

Mein Ziel ist es, etwas zu schreiben, die mich lassen würde eine ged-Datei importieren und eine .dot-Datei für graphviz exportieren, so dass ich eine visuelle Darstellung eines Stammbaum machen

Dank, wenn Sie helfen können

War es hilfreich?

Lösung

Heres mein bester Versuch so weit.

Es scheint zu funktionieren, was ich defiently nicht vollen Beweis obwohl sein müssen (dann mein Stammbaum wieder ziemlich groß ist und fügt hinzu, dass eine gewisse Komplexität)

Bitte lassen Sie mich wissen, wenn Sie denken, ich könnte etwas mehr elequient

machen
struct INDI
        {
            public string ID;
            public string Name;
            public string Sex;
            public string BirthDay;
            public bool Dead;


        }
        struct FAM
        {
            public string FamID;
            public string type;
            public string IndiID;
        }
        List<INDI> Individuals = new List<INDI>();
        List<FAM> Family = new List<FAM>();
        private void button1_Click(object sender, EventArgs e)
        {
            string path = @"C:\mostrecent.ged";
            ParseGedcom(path);
        }

        private void ParseGedcom(string path)
        {
            //Open path to GED file
            StreamReader SR = new StreamReader(path);

            //Read entire block and then plit on 0 @ for individuals and familys (no other info is needed for this instance)
            string[] Holder = SR.ReadToEnd().Replace("0 @", "\u0646").Split('\u0646');

            //For each new cell in the holder array look for Individuals and familys
            foreach (string Node in Holder)
            {

                //Sub Split the string on the returns to get a true block of info
                string[] SubNode = Node.Replace("\r\n", "\r").Split('\r');
                //If a individual is found
                if (SubNode[0].Contains("INDI"))
                {
                    //Create new Structure
                    INDI I = new INDI();
                    //Add the ID number and remove extra formating
                    I.ID = SubNode[0].Replace("@", "").Replace(" INDI", "").Trim();
                    //Find the name remove extra formating for last name
                    I.Name = SubNode[FindIndexinArray(SubNode, "NAME")].Replace("1 NAME", "").Replace("/", "").Trim(); 
                    //Find Sex and remove extra formating
                    I.Sex = SubNode[FindIndexinArray(SubNode, "SEX")].Replace("1 SEX ", "").Trim();

                    //Deterine if there is a brithday -1 means no
                    if (FindIndexinArray(SubNode, "1 BIRT ") != -1)
                    {
                        // add birthday to Struct 
                        I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim();
                    }

                    // deterimin if there is a death tag will return -1 if not found
                    if (FindIndexinArray(SubNode, "1 DEAT ") != -1)
                    {
                        //convert Y or N to true or false ( defaults to False so no need to change unless Y is found.
                        if (SubNode[FindIndexinArray(SubNode, "1 DEAT ")].Replace("1 DEAT ", "").Trim() == "Y")
                        {
                            //set death
                            I.Dead = true;
                        }
                    }
                    //add the Struct to the list for later use
                    Individuals.Add(I);
                }

                // Start Family section
                else if (SubNode[0].Contains("FAM"))
                {
                    //grab Fam id from node early on to keep from doing it over and over
                    string FamID = SubNode[0].Replace("@ FAM", "");

                    // Multiple children can exist for each family so this section had to be a bit more dynaimic

                    // Look at each line of node
                    foreach (string Line in SubNode)
                    {
                        // If node is HUSB
                        if (Line.Contains("1 HUSB "))
                        {

                            FAM F = new FAM();
                            F.FamID = FamID;
                            F.type = "PAR";
                            F.IndiID = Line.Replace("1 HUSB ", "").Replace("@","").Trim();
                            Family.Add(F);
                        }
                            //If node for Wife
                        else if (Line.Contains("1 WIFE "))
                        {
                            FAM F = new FAM();
                            F.FamID = FamID;
                            F.type = "PAR";
                            F.IndiID = Line.Replace("1 WIFE ", "").Replace("@", "").Trim();
                            Family.Add(F);
                        }
                            //if node for multi children
                        else if (Line.Contains("1 CHIL "))
                        {
                            FAM F = new FAM();
                             F.FamID = FamID;
                            F.type = "CHIL";
                            F.IndiID = Line.Replace("1 CHIL ", "").Replace("@", "");
                            Family.Add(F);
                        }
                    }
                }
            }
        }

        private int FindIndexinArray(string[] Arr, string search)
        {
            int Val = -1;
            for (int i = 0; i < Arr.Length; i++)
            {
                if (Arr[i].Contains(search))
                {
                    Val = i;
                }
            }
            return Val;
        }

Andere Tipps

Es ist ein sehr hübsches bei Codeplex: FamilyShow (a WPF Vitrine). Es Import / Export GEDCOM 5.5 und es ist Quelle.

Ich habe überrascht eigentlich worden, wenn es nicht zumindest die Anfänge von einem. Ich fand Gedcom.NET ( Source ) ganz einfach

Ich wäre ziemlich überrascht, wenn es eine C # Leser für dieses Format im Internet verfügbar war, da es sich um eine sehr spezielle Format ist. Auf der anderen Seite sieht das Format ziemlich einfach zu sein zu lesen, wenn Sie Ihre eigenen Leser erstellen müssen. Ich würde vorschlagen, dass der Pfad hinunter und kommt zurück zu SO, wenn Sie spezielle Fragen über die Umsetzung haben. Werfen Sie einen Blick auf die System.IO.StreamReader-Klasse; es ist trivial in einer Datei Zeile-für-Zeile auf diese Weise, und Analysieren der einzelnen Linien als auch einfach sein sollte zu lesen.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top