2009-05-07 20 views
7

Có ai biết về một lớp học tốt để đọc trong các tệp .gedGedcom Reader cho C#

Gedcom là định dạng tệp được sử dụng để lưu trữ thông tin phả hệ.

Mục tiêu của tôi là viết một cái gì đó mà có thể cho tôi nhập khẩu một tập tin GED và xuất khẩu một tập tin Dot cho graphviz để tôi có thể làm cho một hình ảnh của một cây gia đình

nhờ nếu bạn có thể giúp

+2

typo: địa chất thay vì phả –

+5

@Joel C. (tags): GEDCOM là một định dạng tập tin gia phả, không địa chất hoặc định vị. (Tuyên bố "biểu thị trực quan của một cây gia đình" có thể đã giúp quá ...) – GalacticCowboy

Trả lời

5

Heres nỗ lực tốt nhất của tôi cho đến nay.

Nó dường như được làm việc cho những gì tôi cần mặc dù bằng chứng defiently không đầy đủ của nó (sau đó một lần nữa cây gia đình của tôi là khá lớn và có thêm một số phức tạp)

xin vui lòng cho tôi biết nếu bạn nghĩ rằng tôi có thể làm bất cứ điều gì nhiều hơn 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

Tôi sẽ khá ngạc nhiên nếu có một trình đọc C# cho định dạng này có sẵn trên web, cho rằng đó là một định dạng khá chuyên ngành. Ở phía trên, định dạng có vẻ khá đơn giản để đọc nếu bạn cần tạo trình đọc của riêng bạn. Tôi sẽ đề nghị đi xuống con đường đó và quay lại SO nếu bạn có câu hỏi cụ thể về việc triển khai. Hãy xem qua lớp System.IO.StreamReader; nó là tầm thường để đọc trong một tập tin từng dòng theo cách đó, và phân tích các dòng riêng lẻ cũng nên đơn giản.

Chúc may mắn!

+0

Tôi biết đó có thể là những gì sẽ xảy ra. Tôi muốn tránh điều đó nếu có thể (không cần phải tái phát minh ra bánh xe). – Crash893

+0

Tôi nghĩ rằng tôi có thể có một ý tưởng làm thế nào tôi muốn làm điều này --- mỗi cá nhân được phân cách. thì mỗi gia đình được phân định bằng con trỏ cho các cá nhân có liên quan. Tôi nghĩ rằng nếu chỉ đọc thông tin đó bị bệnh là tốt. Tôi muốn họ sẽ đi xml như phần còn lại của các định dạng văn minh. – Crash893

4

Có một phiên bản rất đẹp tại Codeplex: FamilyShow (bản trình diễn WPF). Nó nhập/xuất GEDCOM 5.5 và có nguồn.

+0

chương trình gia đình khá thú vị. Tôi đang thực hiện một thứ gì đó để giúp hình dung mọi thứ tương tự như vậy – Crash893

+0

Tôi đã dành một vài ngày với chương trình gia đình ngay bây giờ. và thành thật mà nói nó hút @ # $ @ $. Rất đẹp của nó không làm cho tôi sai, nhưng nó cũng rất bugy (ít nhất là trong xp) và không xử lý rất nhiều điều tốt ít nhất trong số đó là nhập khẩu gedcom – Crash893

4

Tôi thực sự sẽ ngạc nhiên nếu có không phải là ít nhất là sự khởi đầu của một. Tôi tìm thấy Gedcom.NET (sourceforge) khá dễ dàng

+2

1 cho hiển thị nhỏ của tôi mindedness;) –

+0

tôi thấy rằng quá. đây cũng có thể là trải nghiệm thiếu hoàn chỉnh của tôi nhưng cấu trúc lớp học có vẻ khá phức tạp. – Crash893

+1

Có thể hữu ích khi đề cập đến điều đó trong câu hỏi của bạn và có lẽ bạn thấy phức tạp. Nó có thể tốt hơn để cố gắng để xem nếu bạn có thể hiểu điều này (có lẽ liên hệ với tác giả hoặc đặt câu hỏi khác ở đây) hơn là tái tạo một phiên bản đơn giản mà dần dần sẽ trở nên phức tạp hơn. –

Các vấn đề liên quan