2012-10-12 7 views
13

Ich möchte eine Zeichenkette in der txt Datei finden, wenn Zeichenkette vergleicht, sollte es fortfahren, Zeilen bis zu einer anderen Zeichenkette zu lesen, die ich als Parameter verwende.C# Suchzeichenkette in der txt Datei

Beispiel:

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

Ich brauche die Details sonst mit ihnen zu arbeiten.

Ich verwende Linq für "CustomerEN" wie folgt zu:

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

Aber jetzt bin ich mit dem Lesen Zeilen (Daten) bis "CustomerCh" stuck Details zu extrahieren.

+0

klingt wie Sie reguläre Ausdrücke müssen und nicht Linq – thumbmunkeys

Antwort

15

Wenn Ihr Leitungspaar nur einmal in der Datei angezeigt wird, Sie

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

Wenn Sie mehrere Vorkommen in einer Datei haben könnten, sind Sie wahrscheinlich besser dran mit einer regulären foreach Schleife - Zeilen lesen, Trac halten k davon, ob Sie zur Zeit innerhalb oder außerhalb eines Kunden 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

Wenn Sie Groß- und Kleinschreibung suchen müssen http://stackoverflow.com/questions/444798/case-insensitive-containsstring überprüfen –

2

Wenn Sie nur eine erste Zeichenfolge verwenden, können Sie eine einfache For-Schleife verwenden.

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

Mit LINQ können Sie die SkipWhile/TakeWhile Methoden wie folgt verwenden:

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

Sie haben while seit foreach nutzen, um über Index nicht kennt. Unten ist ein Beispielcode.

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

Sie Ich brauche den Index nicht wirklich zu kennen. – Rawling

+0

Er muss die erste Zeichenfolge finden, die nur nach einem anderen Schlüsselwort angezeigt wird. –

+0

Und es gibt keinen Grund, dass Sie den Schalter nicht auch in eine foreach setzen könnten, wenn Sie wollten. – Chris

0

arbeitete ich ein wenig die Methode, die Rawlings hier gepostet mehr als eine Zeile in der gleichen Datei bis zum Ende zu finden. Dies ist, was für mich gearbeitet:

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