Документация Engee
Notebook

Чтение файлов GEDCOM

В этом примере рассматривается чтение и вывод на печать в Engee персональных данных из файла формата GEDCOM.

Введение

GEDCOM (от англ. Genealogical Data Communications) — спецификация для обмена генеалогическими данными между разными генеалогическими программами. Большинство современных генеалогических компьютерных программ поддерживает импорт/экспорт данных в формате GEDCOM. В этом примере мы создадим простую программу, которая будет читать файл GEDCOM и выводить информацию о персонах, указанных в файле.

Функция чтения .ged-файла

Функция parse_gedcom() работает следующим образом:

  • читает файл GEDCOM и извлекает информацию о персонах;

  • использует словарь individuals, где ключом является ID персоны, а значением — другой словарь с информацией о персоне (имя, дата рождения и т.д.);

  • ищет строки, начинающиеся с 0 @ и содержащие INDI, чтобы определить начало записи о персоне;

  • извлекает имя персоны и дату рождения, если они присутствуют.

In [ ]:
function parse_gedcom(file_path::String)
    individuals = Dict{String, Dict{String, String}}()
    current_id = ""

    open(file_path, "r") do file
        for line in eachline(file)
            line = strip(line)
            if startswith(line, "0 @") && contains(line, "INDI")

                # Найдем ID персоны
                current_id = match(r"@I\d+@", line).match
                individuals[current_id] = Dict{String, String}()

            elseif startswith(line, "1 NAME")

                # Извлечем имя персоны
                name = replace(line, r"1 NAME " => "")
                individuals[current_id]["NAME"] = name

            elseif startswith(line, "1 BIRT")
                
                # Извлечем дату рождения
                birth_date = ""
                for inner_line in eachline(file)
                    inner_line = strip(inner_line)
                    if startswith(inner_line, "2 DATE")
                        birth_date = replace(inner_line, r"2 DATE " => "")
                        break
                    end
                end
                individuals[current_id]["BIRT"] = birth_date
            end
        end
    end

    return individuals
end
Out[0]:
parse_gedcom (generic function with 1 method)

Функция печати полученных данных

Функция print_individuals() выводит информацию о персонах в удобочитаемом формате.

In [ ]:
function print_individuals(individuals::Dict{String, Dict{String, String}})
    for (id, data) in individuals
        println("ID: $id")
        println("Name: $(data["NAME"])")
        if haskey(data, "BIRT")
            println("Birth Date: $(data["BIRT"])")
        end
        println()
    end
end
Out[0]:
print_individuals (generic function with 1 method)

Пример чтения .ged-файла

В папке примера располагается файл GEDCOM example.ged с примером персональных данных одной семьи. Передадим путь к этому файлу в функцию чтения GEDCOM, а затем выведем на печать полученные данные.

In [ ]:
# Пример использования
file_path = "$(@__DIR__)/example.ged"
individuals = parse_gedcom(file_path)
print_individuals(individuals)
ID: @I3@
Name: Лилия /Органова/
Birth Date: 04 MAY 0019

ID: @I4@
Name: Рада /Амидалова/
Birth Date: 04 MAY 0046

ID: @I2@
Name: Аникей /Скайволков/
Birth Date: 04 MAY 0041

ID: @I1@
Name: Лука /Скайволков/
Birth Date: 04 MAY 0019

Как видно из ячейки с результатами выполнения кодовой ячейки, требуемые данные по всем членам семьи были выведены на печать.

Вывод

В этом примере были рассмотрены чтение и вывод на печать в Engee персональных данных из файла формата GEDCOM.