2012-10-12 62 views
13

Tôi muốn tìm một chuỗi trong tệp txt nếu chuỗi so sánh, nó sẽ đi trên các dòng đọc cho đến một chuỗi khác mà tôi đang sử dụng làm tham số.chuỗi tìm kiếm C# trong tệp txt

Ví dụ:

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

tôi cần các chi tiết để làm việc với họ khác.

Tôi đang sử dụng LINQ để tìm kiếm "CustomerEN" như thế này:

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

Nhưng bây giờ tôi đang mắc kẹt với những đường nét đọc (dữ liệu) cho đến khi "CustomerCh" để trích xuất thông tin chi tiết.

+0

vẻ như bạn cần biểu thức thông thường và không LINQ – thumbmunkeys

Trả lời

15

Nếu cặp bạn đường sẽ chỉ xuất hiện một lần trong tập tin của bạn, bạn có thể sử dụng

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

Nếu bạn có thể có nhiều lần xuất hiện trong một tệp, có lẽ bạn nên sử dụng vòng lặp thông thường foreach - đọc các dòng, giữ nguyên k kể bạn hiện đang ở trong hoặc bên ngoài một khách hàng vv:

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

Nếu bạn cần tìm kiếm trường hợp không nhạy cảm kiểm tra http://stackoverflow.com/questions/444798/case-insensitive-containsstring –

2

Nếu bạn chỉ sử dụng một chuỗi đầu tiên, bạn có thể sử dụng vòng lặp đơn giản.

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

Với LINQ, bạn có thể sử dụng SkipWhile/TakeWhile phương pháp, như thế này:

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

Bạn phải sử dụng while từ foreach không biết về chỉ số. Dưới đây là một mã ví dụ.

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

Bạn không thực sự cần biết chỉ mục. – Rawling

+0

Anh ấy cần phải tìm chuỗi đầu tiên, chỉ xuất hiện sau từ khóa khác. –

+0

Và không có lý do gì mà bạn không thể đặt bộ đếm trong một foreach nữa nếu bạn muốn. – Chris

0

Tôi đã làm việc một chút phương pháp mà Rawling đăng ở đây để tìm nhiều hơn một dòng trong cùng một tệp cho đến khi kết thúc. Đây là những gì làm việc cho tôi:

   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); 
Các vấn đề liên quan