2012-10-12 136 views
13

Quiero encontrar una cadena en el archivo txt si la cadena se compara, debería seguir leyendo líneas hasta otra cadena que estoy usando como parámetro.cadena de búsqueda C# en el archivo de texto

Ejemplo:

CustomerEN //search for this string 
... 
some text wich has details about customer 
id "123456" 
username "rootuser" 
... 
CustomerCh //get text till this string 

necesito los detalles para trabajar con ellos de otro modo.

estoy usando LINQ para buscar "CustomerEN" de esta manera:

File.ReadLines(pathToTextFile).Any(line => line.Contains("CustomerEN")) 

Pero ahora tengo que cargar con las líneas de lectura (datos) hasta "CustomerCh" para extraer los detalles.

+0

suena como que necesita expresiones regulares y no LINQ – thumbmunkeys

Respuesta

15

Si su par de líneas sólo aparecerá una vez en su archivo, se puede usar

File.ReadLines(pathToTextFile) 
    .SkipWhile(line => !line.Contains("CustomerEN")) 
    .Skip(1) // optional 
    .TakeWhile(line => !line.Contains("CustomerCh")); 

Si puede tener varias ocurrencias en un archivo, probablemente sea mejor que use un ciclo normal foreach - leyendo líneas, manteniendo el trazador k de si usted está actualmente dentro o fuera de un cliente, etc:

List<List<string>> groups = new List<List<string>>(); 
List<string> current = null; 
foreach (var line in File.ReadAllLines(pathToFile)) 
{ 
    if (line.Contains("CustomerEN") && current == null) 
     current = new List<string>(); 
    else if (line.Contains("CustomerCh") && current != null) 
    { 
     groups.Add(current); 
     current = null; 
    } 
    if (current != null) 
     current.Add(line); 
} 
+1

Si necesita búsqueda que ignore echa un vistazo a http://stackoverflow.com/questions/444798/case-insensitive-containsstring –

2

Si solo es una primera cadena, puede usar for-loop simple.

var lines = File.ReadAllLines(pathToTextFile); 

var firstFound = false; 
for(int index = 0; index < lines.Count; index++) 
{ 
    if(!firstFound && lines[index].Contains("CustomerEN")) 
    { 
     firstFound = true; 
    } 
    if(firstFound && lines[index].Contains("CustomerCh")) 
    { 
     //do, what you want, and exit the loop 
     // return lines[index]; 
    } 
} 
4

Con LINQ, puede utilizar los SkipWhile/TakeWhile métodos, como esto:

var importantLines = 
    File.ReadLines(pathToTextFile) 
    .SkipWhile(line => !line.Contains("CustomerEN")) 
    .TakeWhile(line => !line.Contains("CustomerCh")); 
7

usted tiene que utilizar while desde foreach no sabe de índice. A continuación hay un código de ejemplo.

int counter = 0; 
string line; 

Console.Write("Input your search text: "); 
var text = Console.ReadLine(); 

System.IO.StreamReader file = 
    new System.IO.StreamReader("SampleInput1.txt"); 

while ((line = file.ReadLine()) != null) 
{ 
    if (line.Contains(text)) 
    { 
     break; 
    } 

    counter++; 
} 

Console.WriteLine("Line number: {0}", counter); 

file.Close(); 

Console.ReadLine(); 
+0

Usted realmente no necesita saber el índice. – Rawling

+0

Necesita encontrar la primera cadena, que aparece solo después de otra palabra clave. –

+0

Y no hay ninguna razón por la que no puedas poner el contador en un foreach también si lo deseas. – Chris

0

He trabajado un poco el método que Rawling publicó aquí para encontrar más de una línea en el mismo archivo hasta el final. Esto es lo que funcionó para mí:

   foreach (var line in File.ReadLines(pathToFile)) 
       { 
        if (line.Contains("CustomerEN") && current == null) 
        { 
         current = new List<string>(); 
         current.Add(line); 
        } 
        else if (line.Contains("CustomerEN") && current != null) 
        { 
         current.Add(line); 
        } 
       } 
       string s = String.Join(",", current); 
       MessageBox.Show(s); 
Cuestiones relacionadas