static void Main() { Console.WriteLine("Please enter the name of the input file"); input_file = Console.ReadLine(); try { // открываем поток чтения из файла var sr = new StreamReader(input_file + ".ged", Encoding.Default); // узнаем количество строк в файле и создаем соотвествующий массив int count = File.ReadAllLines(input_file + ".ged").Length; array_file = new string[count]; // считываем все строки в массив for (int i = 0; !sr.EndOfStream; i++) { array_file[i] = sr.ReadLine(); } // закрываем поток входного файла sr.Close(); // пробегаемся по всем строкам массива, если видим строку нащинающуюся с "0 @" // то отдаем массив на растерзание парсеру указав ему с какой строки парсить for (int i = 0; i < array_file.Length; i++) { if (array_file[i].StartsWith("0 @")) { Parse(i); } } // удаляем предыдущий выходной файл File.Delete("family_tree.rtf"); // открываем поток для записи FileStream fs = new FileStream("family_tree.rtf", FileMode.CreateNew); StreamWriter sw = new StreamWriter(fs, Encoding.Default); // пишем заголовок в rtf файл sw.WriteLine(@"{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fprq2\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fnil\fcharset0 Calibri;}}"); sw.WriteLine(@"{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\nowidctlpar\hyphpar0\sa160\kerning3\f0\fs24 %\'cf\'ee\'eb\par"); // прогоняемся по коллекции людей, заодно запишем информацию о них в rtf файл foreach (var x in Person.person_dictionary) { Console.WriteLine("person:" + x.Key); Console.WriteLine(" givn:" + x.Value.givn); Console.WriteLine(" surn:" + x.Value.surn); Console.WriteLine(" male:" + x.Value.sex_male); sw.Write(Rtf.Encoding("gender(\'" + x.Value.givn + "\'-\'" + x.Value.surn + "\'," + (x.Value.sex_male ? "m" : "f"))); sw.WriteLine(").\\par"); } sw.WriteLine("\\par"); sw.Write(Rtf.Encoding("%Кто с кем в браке. Слева мужчина, справа женщина.")); sw.WriteLine("\\par"); // прогоняемся по коллекции семей, заодно запишем информацию о том кто на ком женат foreach (var x in Family.family_dictionary) { try { sw.Write(Rtf.Encoding("marriage(\'" + x.Value.husband.givn + "\'-\'" + x.Value.husband.surn)); } catch { sw.Write(Rtf.Encoding("marriage(\'" + "NOT_PEOPLE")); } try { sw.WriteLine(Rtf.Encoding("\',\'" + x.Value.wife.givn + "\'-\'" + x.Value.wife.surn) + "\').\\par"); } catch { sw.WriteLine(Rtf.Encoding("\',\'" + "NOT_PEOPLE" + "\'-\'") + "\').\\par"); } } sw.WriteLine("\\par"); sw.WriteLine("\\par"); sw.Write(Rtf.Encoding("% у кого какие родители. Отец, мать, ребёнок")); sw.WriteLine("\\par"); // снова прогоняемся по коллекции семей, и запишем информацию о том кто чей ребенок foreach (var x in Family.family_dictionary) { Console.WriteLine("family:" + x.Key); try { Console.WriteLine(" husb:" + x.Value.husband.givn + " " + x.Value.husband.surn); } catch { Console.WriteLine(" husb: NOT_PEOPLE"); } try { Console.WriteLine(" wife:" + x.Value.wife.givn + " " + x.Value.wife.surn); } catch { Console.WriteLine(" wife: NOT_PEOPLE"); } // в каждой семье есть коллекция в которой мы храним всех детей, пробегаемся по ней foreach (var n in x.Value.children) { Console.WriteLine(" chil:" + n.Key); Console.WriteLine(" name:" + n.Value.givn); try { sw.Write(Rtf.Encoding("parents(\'" + x.Value.husband.givn + "\'-\'" + x.Value.husband.surn)); } catch { sw.Write(Rtf.Encoding("parents(\'" + "NOT_PEOPLE")); } try { sw.Write(Rtf.Encoding("\',\'" + x.Value.wife.givn + "\'-\'" + x.Value.wife.surn)); } catch { sw.Write(Rtf.Encoding("\',\'" + "NOT_PEOPLE")); } sw.WriteLine(Rtf.Encoding("\',\'" + n.Value.givn + "\'-\'" + n.Value.surn) + "\').\\par"); } } // обозначаем конец rtf и закрываем поток записи sw.WriteLine(@"}"); sw.Close(); Console.WriteLine("\n\n-----------------------\nReady"); Console.ReadLine(); } // что то пошло не так catch (Exception ex) { Console.Write("Oooops. Error: {0}", ex.Message); Console.ReadLine(); } }