Engee 文档
Notebook

读取 GEDCOM 文件

此示例处理从 GEDCOM 文件中读取和打印Engee个人数据。

简介

GEDCOM(家谱数据通信)是不同家谱程序之间交换家谱数据的规范。大多数现代家谱计算机程序都支持以 GEDCOM 格式导入/导出数据。 在本例中,我们将创建一个简单的程序,读取 GEDCOM 文件并输出文件中指定人员的信息。

读取.ged 文件的功能

parse_gedcom() 功能的工作原理如下:

  • 读取 GEDCOM 文件并提取有关人员的信息;

  • 使用字典individuals ,其中键是个人 ID,值是另一个字典,其中包含有关个人的信息(姓名、出生日期等); * 使用字典 ,其中键是个人 ID,值是另一个字典 其中的键是个人 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-file 的示例

在示例文件夹中有一个 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

正如您在单元格中看到的代码执行结果,所有家庭成员的所需数据都已打印出来。

输出

本例介绍从 GEDCOM 格式文件中读取个人数据并打印到 Engee 中。