문제

나는 Gedcom에서 가져온 텍스트 블록이 있습니다 (여기 그리고 여기) 파일

텍스트는 평평하고 기본적으로 "노드"로 나뉩니다.

r char에서 각 노드를 분할하여 각 부분으로 세분화합니다 ( "선"의 양이 다를 수 있음)

나는 0 주소가 항상 ID가 될 것이라는 것을 알고 있지만 그 후에는 모든 것이 어디에나있을 수 있으므로 배열의 각 셀을 테스트하여 Proccess에 올바른 태그가 포함되어 있는지 확인하고 싶습니다.

두 노드의 모습의 예

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

그래서 IM이 끝났을 때 나는 모양의 배열이 있습니다.

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@"

그래서 내 질문은 성 태그 또는 이름 태그 또는 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을 반환하지 않도록 두 번 부르기 때문에 비효율적 인 것 같습니다.

그렇게 좋아요

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

죄송합니다 이것은 더 긴 게시물이지만 여러분은 전문가의 조언을 드릴 것입니다.

도움이 되었습니까?

해결책

배열 클래스의 정적 메소드 Findall을 사용할 수 있습니다.하지만 작동하면 문자열 자체를 반환합니다.

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

=>은 lamda 표현식을 나타냅니다. 기본적으로 구체적인 구현이없는 방법. Lamda가 당신에게 크리프를 제공하는 경우 에도이 작업을 수행 할 수 있습니다.

//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);

다른 팁

간단한 것은 어떻습니까 정규 표현?

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

첫 번째 그룹은 주소를 캡처하고 두 번째 그룹은 태그입니다.

또한 모든 배열 항목을 문자열에 더 빠르게 덤프하고 한 번에 전체 로트에 대한 동정인을 수행하는 것이 더 빠를 수 있습니다.

"하지만 -1을 반환하지 않도록 두 번 부르기 때문에 비효율적으로 보입니다."

여러 통화를 방지하기 위해 테스트하기 전에 반환 된 값을 변수에 복사하십시오.

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

Method의 for loop in thindexinarray shd break가 첫 번째 일치에만 관심이있는 경우 일치를 찾으면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top