5

私はホビーXojoユーザーです。Gedcom ファイルを自分のプログラム、特に SQLite データベースにインポートしたい。

データベースの構造

テーブル

 - ID: Integer
 - Gender: Varchar // M, F or U
 - Surname: Varchar
 - Givenname: Varchar

関係

 - ID: Integer
 - Husband: Integer
 - Wife: Integer

子供

 - ID: Integer
 - PersonID: Integer
 - FamilyID: Integer
 - Order: Integer

人物イベント

 - ID: Integer
 - PersonID: Integer
 - EventType: Varchar // e.g. BIRT, DEAT, BURI, CHR
 - Date: Varchar
 - Description: Varchar
 - Order: Integer

RelationshipEvents

 - ID: Integer
 - RelationshipID: Integer
 - EventType: Varchar // e.g. MARR, DIV, DIVF
 - Date: Varchar
 - Description: Integer
 - Order: Integer

動作する Gedcom-Line-Parser を作成しました。彼は単一の Gedcomline を次のように分割します。

 - Level As Integer
 - Reference As String // optional
 - Tag As String
 - Value As String // optional

TextInputStream を介して Gedcom-File をロードします (正常に動作しています)。いいえ、すべての行を解析する必要があります。

Gedcom-個人-サンプル

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 にするのが最善かつ最も簡単な方法だと思いました。後で、ノード、子ノードを簡単に読み取ってデータベースエントリを作成できます。しかし、そのようなアルゴリズムを作成する方法がわかりません。

誰か助けてくれませんか?

4

1 に答える 1

3

Gedcom の行を高速に解析するには、次のアイデアを試してください。

ファイル全体を文字列に読み取り、行を分割します。

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 つの列を抽出します

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 検索パターンは、行頭 ("^")、1 つ以上の数字 ("\d")、空白、1 つ以上の空白以外の文字 ("[^ ]") を検索することを意味します。 、最後に文字列 (「$」) の末尾の前に追加の文字 (「.」) を追加します。これらの各グループを囲む括弧は、SubExpression() で結果を抽出するためのものです。

rm = nil のチェックは、行に少なくとも数字、空白、および少なくとも 1 つの文字が含まれていない場合にヒットします。Gedcom ファイルの形式が正しくないか、空白行がある場合は、これが原因である可能性があります。

お役に立てれば。

于 2015-09-03T11:36:39.113 に答える