2011-06-24 44 views
12

Điều tôi muốn làm là tìm tất cả các phiên bản của chuỗi trong tệp văn bản, sau đó thêm các dòng đầy đủ chứa chuỗi đã nói vào một mảng.Tìm chuỗi cụ thể và trả về toàn bộ dòng

Ví dụ:

eng GB English 
lir LR Liberian Creole English 
mao NZ Maori 

Searching eng, ví dụ, phải thêm hai dòng đầu tiên mảng, bao gồm các khóa học nhiều trường hợp hơn 'eng' trong tập tin.

Làm cách nào để thực hiện việc này bằng cách sử dụng đầu vào tệp văn bản và C#?

Trả lời

15

bạn có thể sử dụng TextReader để đọc từng dòng và tìm kiếm nó, nếu bạn tìm thấy những gì u muốn, sau đó thêm dòng đó vào chuỗi mảng

List<string> found = new List<string>(); 
string line; 
using(StreamReader file = new StreamReader("c:\\test.txt")) 
{ 
    while((line = file.ReadLine()) != null) 
    { 
     if(line.Contains("eng")) 
     { 
     found.Add(line); 
     } 
    } 
} 

hoặc bạn có thể sử dụng yield return trở enumurable

0

bạn có thể thử đoạn mã sau, tôi đã thử nó và nó đã làm việc

string searchKeyword = "eng"; 
string fileName = "Some file name here"; 
string[] textLines = File.ReadAllLines(fileName); 
List<string> results = new List<string>(); 

foreach (string line in textLines) 
{ 
    if (line.Contains(searchKeyword)) 
    { 
     results.Add(line); 
    } 
} 
7

Một dòng:

using System.IO; 
using System.Linq; 

var result = File.ReadAllLines(@"c:\temp").Select(s => s.Contains("eng")); 

Hoặc, nếu bạn muốn có giải pháp hiệu quả hơn, bạn có thể cuộn phương pháp mở rộng. Bạn có thể sử dụng FileInfo, FileStream, vv như xử lý cơ sở:

public static IEnumerable<string> ReadAndFilter(this FileInfo info, Predicate<string> condition) 
{ 
    string line; 

    using (var reader = new StreamReader(info.FullName)) 
    { 
     while ((line = reader.ReadLine()) != null) 
     { 
      if (condition(line)) 
      { 
       yield return line; 
      } 
     } 
    } 
} 

Cách sử dụng:

var result = new FileInfo(path).ReadAndFilter(s => s.Contains("eng")); 
0

Đối tượng File chứa một ReadLines phương pháp tĩnh trả về line-by-line, trái ngược với ReadAllLines trả về một mảng và do đó cần tải toàn bộ tệp trong bộ nhớ.

Vì vậy, bằng cách sử dụng File.ReadLines và LINQ một giải pháp hiệu quả và ngắn có thể được viết như sau:

var found = File.ReadLines().Where(line => line.Contains("eng")).ToArray(); 

Đối với câu hỏi ban đầu, nó có thể được tối ưu hóa hơn nữa bằng cách thay thế line.Contains với line.StartsWith, vì nó dường như sự cần thiết cụm từ xuất hiện ở đầu mỗi dòng.

Các vấn đề liên quan