GedcomReaderforC#有没有人知道阅读.ged文件的好类Gedcom是一种存储家谱信息的文件格式。我的目标是编写一些东西,让我可以为graphviz导入一个ged文件并导出一个.vot文件,这样我就可以直观地表示一个家谱如果你能提供帮助,谢谢这是我迄今为止最好的尝试。它似乎可以满足我的需要,尽管它绝对没有得到充分证明(然后我的家谱又很大,这增加了一些复杂性)如果您认为我可以做更多,请告诉我structINDI{publicpublicstringName;公共字符串性别;公共字符串生日;公共布尔死了;}structFAM{publicstringFamID;公共字符串类型;公共字符串IndiID;}列出个体=newList();列表族=新列表();privatevoidbutton1_Click(objectsender,EventArgse){stringpath=@"C:mostrecent.ged";ParseGedcom(路径);}privatevoidParseGedcom(stringpath){//打开GED文件的路径StreamReaderSR=newStreamReader(path);//读取整个块,然后为个人和家庭在0@上拆分(此实例不需要其他信息)string[]Holder=SR.ReadToEnd().Replace("0@","u0646").Split('u0646');//对于holder数组中的每个新单元格,查找Individuals和familiesforeach(stringNodeinHolder){//Sub拆分返回的字符串以获得真实的信息块string[]SubNode=Node.Replace("rn","r").拆分('r');//如果找到个体if(SubNode[0].Contains("INDI")){//CreatenewStructureINDII=newINDI();//添加ID号并去除多余的格式I.ID=SubNode[0].Replace("@","").Replace("INDI","").Trim();//查找名称删除姓氏的额外格式I.Name=SubNode[FindIndexinArray(SubNode,"NAME")].Replace("1NAME","").Replace("/","").Trim();//查找性别并删除多余的格式I.Sex=SubNode[FindIndexinArray(SubNode,"SEX")].Replace("1SEX","").Trim();//判断是否有生日-1表示没有if(FindIndexinArray(SubNode,"1BIRT")!=-1){//添加生日到StructI.BirthDay=SubNode[FindIndexinArray(SubNode,"1BIRT")+1].Replace("2DATE","").Trim();}//deterimin如果有死亡标签,如果没有找到则返回-1if(FindIndexinArray(SubNode,"1DEAT")!=-1){//将Y或N转换为true或false(默认为False所以没有除非找到Y,否则需要更改。if(SubNode[FindIndexinArray(SubNode,"1DEAT")].Replace("1DEAT","").Trim()=="Y"){//setdeathI.Dead=true;}}//将Struct添加到列表中供以后使用Individuals.Add(I);}//开始Familysectionelseif(SubNode[0].Contains("FAM")){//尽早从节点中获取Famid以防止一遍又一遍地这样做stringFamID=SubNode[0].Replace("@FAM","");//每个家庭可以有多个孩子,所以这部分必须更动态一点//查看节点的每一行foreach(stringLineinSubNode){//如果节点是HUSBif(Line.Contains("1HUSB")){FAMF=newFAM();F.FamID=FamID;F.type="PAR";F.IndiID=Line.Replace("1HUSB","").Replace("@","").Trim();Family.Add(F);}//IfnodeforWifeelseif(Line.Contains("1WIFE")){FAMF=newFAM();F.FamID=FamID;F.type="PAR";F.IndiID=Line.Replace("1WIFE","").Replace("@","").Trim();Family.Add(F);}//ifnodeformultichildrenelseif(Line.Contains("1CHIL")){FAMF=newFAM();F.FamID=FamID;F.type="孩子";F.IndiID=Line.Replace("1CHIL","").Replace("@","");家庭.Add(F);}}}}}privateintFindIndexinArray(string[]Arr,stringsearch){intVal=-1;for(inti=0;i在Codeplex中有一个非常好的:FamilyShow(WPFshow),它导入/导出GEDCOM5.5并具有源代码。如果至少有一个,如果我从Gedcom开始,我会感到非常惊讶。NET(sourceforge)很容易。如果网上有这种格式的C#阅读器,我会感到非常惊讶,因为它是一种相当专业的格式。从好的方面来说,如果您需要创建自己的格式,该格式看起来非常简单读者。如果您对实现有具体问题,我建议您沿着这条路走下去,然后回到SO。看看System.IO.StreamReader类;以这种方式逐行读取文件很简单,解析行也要简单,用过,需要多了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场,如涉及侵权,敬请谅解点击右边联系管理员删除,如需转载请注明出处:
