2011-06-24 19 views
12

Yapmak istediğim şey, bir dizenin tüm örneklerini bir metin dosyasında bulmak, ardından söz konusu dizeyi içeren satırların tümünü bir diziye eklemek. ÖrneğinBelirli bir dizeyi arayın ve tüm satırı geri döndürün

:

eng GB English 
lir LR Liberian Creole English 
mao NZ Maori 

Arıyor eng, örneğin, tabii dosyasında 'eng' daha birçok örneğini içeren diziye ilk iki satırı eklemeniz gerekir.

Bu nasıl yapılır, bir metin dosyası girişi ve C#?

cevap

15

Eğer u istediğinizi bulmak ise, her satır okumak ve ona aramak için TextReader kullanabilirsiniz ardından dize dizisi

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

içine o çizgiyi ekleyin veya enumurable dönmek için yield return kullanabilirsiniz

0

Sen bunu denedik aşağıdaki kodu deneyebilirsiniz ve o was çalışma

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

Bir satır:

using System.IO; 
using System.Linq; 

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

Veya daha fazla bellek etkin bir çözüm istiyorsanız, bir uzantı yöntemi kullanabilirsiniz. Baz işleyici olarak FileInfo, FileStream vb kullanabilir:

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

Kullanım:

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

File nesne ReadAllLines aksine, çizgi-satır döndüren bir statik ReadLines yöntemi içerir bir dizi döndürür ve bu nedenle tüm dosyayı belleğe yüklemesi gerekir. gerekli göründüğü gibi asıl soruya gelince

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

, bu line.StartsWith ile line.Contains değiştirilmesi ile daha da optimize edilebilir: etkin ve kısa çözüm File.ReadLines kullanarak ve LINQ tarafından Yani

olarak yazılmış olabilir terimi her satırın başında görünür.

İlgili konular