首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Gedcom解析为SQLite数据库

将Gedcom解析为SQLite数据库
EN

Stack Overflow用户
提问于 2015-09-01 07:15:37
回答 1查看 1K关注 0票数 5

我是一个霍比Xojo用户。我想导入一个Gedcom-文件到我的程序,尤其是一个SQLite-数据库。

数据库结构

表格

代码语言:javascript
复制
 - ID: Integer
 - Gender: Varchar // M, F or U
 - Surname: Varchar
 - Givenname: Varchar

关系

代码语言:javascript
复制
 - ID: Integer
 - Husband: Integer
 - Wife: Integer

孩子们

代码语言:javascript
复制
 - ID: Integer
 - PersonID: Integer
 - FamilyID: Integer
 - Order: Integer

PersonEvents

代码语言:javascript
复制
 - ID: Integer
 - PersonID: Integer
 - EventType: Varchar // e.g. BIRT, DEAT, BURI, CHR
 - Date: Varchar
 - Description: Varchar
 - Order: Integer

RelationshipEvents

代码语言:javascript
复制
 - ID: Integer
 - RelationshipID: Integer
 - EventType: Varchar // e.g. MARR, DIV, DIVF
 - Date: Varchar
 - Description: Integer
 - Order: Integer

我写了一个正在工作的Gedcom-线-分析器。他把一个单独的Gedcomline分成:

代码语言:javascript
复制
 - Level As Integer
 - Reference As String // optional
 - Tag As String
 - Value As String // optional

我通过TextInputStream加载Gedcom-文件(工作正常)。不,我需要解析每一行。

Gedcom-个别样本

代码语言:javascript
复制
0 @I1@ INDI
1 NAME George /Clooney/
2 GIVN George
2 SURN Clooney
1 BIRT
2 DATE 6 MAY 1961
2 PLAC Lexington, Fayette County, Kentucky, USA

你会看到,水平数字显示了一个“树结构”。因此,我认为这将是将文件解析为分离对象(PersonObj、RelationshipObj、EventObj等)的最佳和最简单的方法。变成一个JSONItem,因为那里很容易得到节点的孩子。稍后,我可以简单地读取节点、子节点来创建数据库条目.但我不知道如何创建这样的算法。

有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 11:36:39

要以良好的速度解析Gedcom行,请尝试以下思路:

将整个文件读入字符串,并将行拆分为:

代码语言:javascript
复制
dim f as FolderItem = ...
dim fileContent as String = TextInputStream.Open(f).ReadAll
fileContent = fileContent.DefineEncoding (Encodings.WindowsLatin1)
dim lines() as String = ReplaceLineEndings(fileContent,EndOfLine).Split(EndOfLine)

使用RegEx解析每一行以提取其3列

代码语言:javascript
复制
dim re as new RegEx
re.SearchPattern = "^(\d+) ([^ ]+)(.*)$"
for each line as String in lines
  dim rm as RegExMatch = re.Search (line)
  if rm = nil then
    // nothing found in this line. Is this correct?
    break
    continue // -> onward with next line
  end
  dim level as Integer = rm.SubExpressionString(1).Val
  dim code as String = rm.SubExpressionString(2)
  dim value as String = rm.SubExpressionString(3).Trim
  ... process the level, code and value
next

RegEx搜索模式意味着它查找行的开头("^"),然后查找一个或多个数字("\d")、一个空白的、一个或多个非空白字符("^ "),最后查找任何其他字符(“”)。在字符串结束之前("$")。这些组周围的括号用于使用SubExpression()提取其结果。

每当该行不包含至少一个数字、一个空字符和至少一个字符时,rm = nil的检查就会命中。如果Gedcom文件格式错误或有空行,则可能是这种情况。

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32325685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档