2009-05-07 8 views
7

Кто-нибудь знает хорошего класса, чтобы читать в .ged файловGedcom Хрестоматия для C#

Gedcom это формат файла, используемый для хранения генеалогической информации.

Моя цель состоит в том, чтобы написать что-то, что позволит мне импортировать GED файл и экспортировать .dot файл для GraphViz так, что я могу сделать визуальное представление генеалогического древа

спасибо, если вы можете помочь

+2

Опечатка: геологическую вместо генеалогического –

+5

@Joel C. (теги): GEDCOM является генеалогический формат файла, а не геологии или геолокации. (Утверждение «визуальное представление генеалогического древа», возможно, тоже помогло ...) – GalacticCowboy

ответ

5

Heres моя лучшая попытка.

Это, кажется, работает для того, что мне нужно, хотя его defiently не полное доказательство (опять же мое семейное дерево довольно велико, и что добавляет некоторую сложность)

пожалуйста, дайте мне знать, если вы думаете, что я мог бы сделать что-нибудь еще elequient

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; 
     } 
1

Я был бы довольно удивлен, если бы был читатель C# для этого формата, доступный в Интернете, учитывая, что это довольно специализированный формат. В верхней части формат выглядит довольно простым для чтения, если вам нужно создать своего собственного читателя. Я бы предложил пойти по этому пути и вернуться к SO, если у вас есть конкретные вопросы об осуществлении. Взгляните на класс System.IO.StreamReader; тривиально читать в файле по очереди таким образом, а разбор отдельных строк также должен быть простым.

Удачи вам!

+0

Я знаю, что это, вероятно, произойдет. Я хотел бы избежать этого, если это возможно (нет необходимости повторно изобретать колесо). – Crash893

+0

Я думаю, что у меня есть идея, как я хочу это сделать - каждый человек делится. , то каждая семья делится указателем на вовлеченных лиц. Я думаю, что если бы просто прочитал эту информацию в плохой ситуации. Мне жаль, что они не отправятся в xml, как остальные цивилизованные форматы. – Crash893

4

В Codeplex есть очень красивый: FamilyShow (витрина WPF). Он импортирует/экспортирует GEDCOM 5.5 и есть источник.

+0

Семейное шоу довольно круто. Я работаю над чем-то, чтобы помочь визуализировать все так же, как это – Crash893

+0

Я провел несколько дней с семейным шоу. и, честно говоря, это отстой @ # $ @ $. Его очень красивое не пойми меня неправильно, но его также очень bugy (по крайней мере, в xp) и не обрабатывает много вещей, и наименьшее из которых - импорт gedcom. – Crash893

4

Я бы действительно был удивлен, если не был хотя бы одним из первых. Я нашел Gedcom.NET (sourceforge) довольно легко

+2

+1 для отображения моей малодушии;) –

+0

I это тоже. это также может быть моим полным отсутствием опыта, но структура классов кажется довольно сложной. – Crash893

+1

Было бы полезно упомянуть об этом в вашем вопросе и, возможно, о том, что вы найдете сложным. Вероятно, лучше попытаться понять, можете ли вы это понять (возможно, обратитесь к автору или задайте другой вопрос здесь), чем изобретать более простую версию, которая постепенно станет более сложной. –

 Смежные вопросы

  • Нет связанных вопросов^_^