Pregunta

Tengo un bloque de texto que im tomando de un Gedcom ( Aquí y Aquí ) archivo

El texto es plana y básicamente roto en "nodos"

Estoy dividiendo cada nodo de la \ r carbón y por lo tanto subdividirlo en cada una de sus partes (cantidad de "líneas" puede variar)

Sé que la dirección 0 será siempre el ID pero después de que todo puede estar en cualquier lugar, así que quiero probar cada celda de la matriz para ver si contiene la etiqueta correcta para mí Proccess

Un ejemplo de lo dos nodos se vería

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

Así que cuando un im hecho tengo una matriz que se parece a

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

Así que mi pregunta es ¿cuál es la mejor manera de buscar la matriz de arriba para ver qué célula tiene la etiqueta sexo o la etiqueta de nombre o la etiqueta de FAMS

este es el código que tengo

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;
}

Pero parece ineficaz porque me acaban de llamar dos veces para asegurarse de que es imposible devolver un -1

Al igual que

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

lo siento esto es un post largo, pero espero que ustedes tendrá algunos consejos de expertos

¿Fue útil?

Solución

Puede utilizar el método FindAll estático de la clase Array: Se devolverá la cadena en sí, aunque, si funciona ..

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

El => indica una expresión lambda. Básicamente, un método sin una aplicación concreta. También puede hacer esto si el lambda que da escalofríos.

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

Otros consejos

¿Qué pasa con un simple expresión regular ?

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

Primer grupo captura la dirección, segundo grupo la etiqueta.

Además, puede ser que sea más rápido para volcar todos los elementos de matriz en una cadena y hacer su expresión regular en todo el lote a la vez.

  

"Pero parece ineficaz porque me acaban de llamar dos veces para asegurarse de que es imposible devolver un -1"

Copia el valor devuelto a una variable antes de probar para evitar múltiples llamadas.

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

El bucle en el método FindIndexinArray SHD romper una vez que encuentre una coincidencia si usted está interesado sólo en el primer partido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top