1

Gedcom(ここここ)ファイルから取得したテキストのブロックがあります

テキストはフラットで、基本的に「ノード」に分割されています

\r char の各ノードを分割し、それを各部分に分割しています (「行」の量は異なる場合があります)。

0 アドレスが常に ID になることはわかっていますが、その後はすべてがどこにでもある可能性があるため、配列の各セルをテストして、処理する正しいタグが含まれているかどうかを確認したいと考えています。

2 つのノードがどのように見えるかの例

0 @ind23815@ INDI <<<<<<<<<<<<<<<<<<< Start of node 1
1 NAME Lawrence /Hucstepe/
2 DISPLAY Lawrence Hucstepe
2 GIVN Lawrence
2 SURN Hucstepe
1 POSITION -850,-210
2 BOUNDARY_RECT (-887,-177),(-813,-257)
1 SEX M
1 BIRT 
2 DATE 1521
1 DEAT Y
2 DATE 1559
1 NOTE     * Born: Abt 1521, Kent, England
2 CONT     * Marriage: Jane Pope 17 Aug 1546, Kent, England
2 CONT     * Died: Bef 1559, Kent, England
2 CONT 
1 FAMS @fam08318@
0 @ind23816@ INDI  <<<<<<<<<<<<<<<<<<<<<<< Start of Node 2
1 NAME Jane /Pope/
2 DISPLAY Jane Pope
2 GIVN Jane
2 SURN Pope
1 POSITION -750,-210
2 BOUNDARY_RECT (-787,-177),(-713,-257)
1 SEX F
1 BIRT 
2 DATE 1525
1 DEAT Y
2 DATE 1609
1 NOTE     * Born: Abt 1525, Tenterden, Kent, England
2 CONT     * Marriage: Lawrence Hucstepe 17 Aug 1546, Kent, England
2 CONT     * Died: 23 Oct 1609
2 CONT 
1 FAMS @fam08318@
0 @ind23817@ INDI  <<<<<<<<<<< start of Node 3

だから、私が終わったら、私は次のような配列を持っています

address , string
0 = "1 NAME Lawrence /Hucstepe/"
1 = "2 DISPLAY Lawrence Hucstepe"
2 = "2 GIVN Lawrence"
3 = "2 SURN Hucstepe"
4 = "1 POSITION -850,-210"
5 = "2 BOUNDARY_RECT (-887,-177),(-813,-257)"
6 = "1 SEX M"
7 = "1 BIRT "
8 = "1 FAMS @fam08318@"

私の質問は、上記の配列を検索して、どのセルにSEXタグ、NAMEタグ、またはFAMSタグがあるかを確認する最良の方法は何ですか?

これは私が持っているコードです

private int FindIndexinArray(string[] Arr, string search)
{
    int Val = -1;
    for (int i = 0; i < Arr.Length; i++)
    {
        if (Arr[i].Contains(search))
        {
            Val = i;
        }
    }
    return Val;
}

しかし、-1を返さないことを確認するために2回呼び出すことになるため、効率が悪いようです

そのようです

if (FindIndexinArray(SubNode, "1 BIRT ") != -1) { // add birthday to Struct I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim(); }

申し訳ありませんが、これはより長い投稿ですが、うまくいけば、専門家のアドバイスが得られます

4

4 に答える 4

3

Array クラスの静的メソッド FindAll を使用できます。ただし、それが機能する場合は、文字列自体を返します..

string[] test = { "Sex", "Love", "Rock and Roll", "Drugs", "Computer"};
Array.FindAll(test, item => item.Contains("Sex") || item.Contains("Drugs") || item.Contains("Computer"));

=> はラムダ式を示します。基本的に具体的な実装のないメソッド。ラムダがゾッとする場合にも、これを行うことができます。

//Declare a method 

     private bool HasTag(string s)
     {
         return s.Contains("Sex") || s.Contains("Drugs") || s.Contains("Computer");
     }

     string[] test = { "Sex", "Love", "Rock and Roll", "Drugs", "Computer"};
     Array.FindAll(test, HasTag);
于 2009-05-13T03:47:00.730 に答える
3

単純な正規表現はどうですか?

^(\d)\s=\s\"\d\s(SEX|BIRT|FAMS){1}.*$

最初のグループはアドレスをキャプチャし、2 番目のグループはタグをキャプチャします。

また、すべての配列アイテムを文字列にダンプし、一度にすべての正規表現を実行する方が速い場合があります。

于 2009-05-13T03:37:29.673 に答える
0

「しかし、-1 を返さないことを確認するために 2 回呼び出すことになるため、効率が悪いようです」

複数の呼び出しを防ぐために、テストする前に戻り値を変数にコピーします。

IndexResults = FindIndexinArray(SubNode, "1 BIRT ")
if (IndexResults != -1)
        {
            // add birthday to Struct 
            I.BirthDay = SubNode[IndexResults].Replace("2 DATE ", "").Trim();
        }
于 2009-05-13T04:29:27.727 に答える
0

最初の一致のみに関心がある場合、FindIndexinArray shd メソッドの for ループは、一致が見つかると中断します。

于 2009-05-13T04:42:37.953 に答える