2009-05-07 12 views
7

Qualcuno sa di una buona classe di leggere nel file .gedGedcom Reader per C#

Gedcom è un formato di file che viene utilizzato per memorizzare le informazioni genealogiche.

Il mio obiettivo è quello di scrivere qualcosa che mi permetteva di importare un file di GED e esportare un file .dot per graphviz in modo che io possa fare una rappresentazione visiva di un albero genealogico

grazie se si può aiutare

+2

Typo: geologico, invece di genealogiche –

+5

@ Joel C. (tag): GEDCOM è un formato di file genealogiche, non la geologia o di geolocalizzazione. (Anche l'affermazione "rappresentazione visiva di un albero genealogico" potrebbe aver aiutato ...) – GalacticCowboy

risposta

5

Ecco il mio miglior tentativo finora.

Sembra di essere al lavoro per quello che ho bisogno anche se la sua prova defiently non completo (poi di nuovo il mio albero genealogico è piuttosto grande e che aggiunge una certa complessità)

per favore fatemi sapere se si pensa che potrei fare qualcosa di più 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

Sarei abbastanza sorpreso se ci fosse un lettore C# per questo formato disponibile sul web, dato che è un formato abbastanza specializzato. Sul lato positivo, il formato sembra piuttosto semplice da leggere se è necessario creare il proprio lettore. Vorrei suggerire di seguire questa strada e tornare in SO se avete domande specifiche sull'implementazione. Dai un'occhiata alla classe System.IO.StreamReader; è banale da leggere in un file riga per riga in questo modo e anche l'analisi delle singole righe dovrebbe essere semplice.

Buona fortuna!

+0

So che probabilmente sta per succedere. Vorrei evitarlo se possibile (non c'è bisogno di reinventare la ruota). – Crash893

+0

Penso di avere un'idea di come voglio fare questo --- ogni individuo è delimitato. quindi ogni famiglia è delimitata con un puntatore agli individui coinvolti. Penso che se solo leggessi che le informazioni non funzionino bene. Spero che vadano xml come il resto dei formati civilizzati. Lo spettacolo di famiglia – Crash893

4

C'è molto bello in Codeplex: FamilyShow (una vetrina WPF). Importa/esporta GEDCOM 5.5 e c'è una fonte.

+0

è molto bello. Sto lavorando su qualcosa per aiutare a visualizzare tutto in modo simile a quello – Crash893

+0

Ho trascorso alcuni giorni con lo show per famiglie ora. e ad essere onesti, fa schifo @ # $ @ $. È molto carino non fraintendetemi ma è anche molto bugy (almeno in xp) e non gestisce un sacco di cose ben di meno che è Gedcom importare – Crash893

4

In realtà sarei stato sorpreso se lo non fosse almeno l'inizio di uno. Ho trovato Gedcom.NET (sourceforge) abbastanza facilmente

+2

+1 per mostrare la mia meschinità;) –

+0

I ho trovato anche questo. questa potrebbe anche essere la mia completa mancanza di esperienza, ma la struttura della classe sembra piuttosto complessa. – Crash893

+1

Sarebbe stato utile menzionarlo nella tua domanda, e forse ciò che trovi complesso. Probabilmente è meglio provare a vedere se riesci a capire questo (magari contatta l'autore o poni un'altra domanda qui) che reinventare una versione più semplice che diventerà via via più complessa. –