2011-06-24 20 views
12

私がしたいのは、テキストファイル内の文字列のすべてのインスタンスを見つけて、その文字列を含む完全な行を配列に追加することです。例えば特定の文字列を検索して行全体を返す

eng GB English 
lir LR Liberian Creole English 
mao NZ Maori 

検索ENGは、例えば、もちろんファイルの「ENG」のより多くの事例を含めて、アレイへの最初の2行を追加する必要があります。

これは、テキストファイル入力とC#を使用してどのように行うことができますか?

答えて

15

あなたはuが欲しいものを見つける場合は、それぞれの行を読んで、それを検索するためにしたTextReaderを使用することができ、その後、文字列配列

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

にその行を追加するか、enumurable返すためにyield returnを使用することができます

0

私はそれを試してみました、次のコードを試すことができ、それが働いていた

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

一行:

using System.IO; 
using System.Linq; 

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

また、より効率的なソリューションが必要な場合は、拡張メソッドをロールバックできます。あなたがベースハンドラとしてFileInfoFileStream、等を使用することができます。

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

使用:

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

FileオブジェクトがReadAllLinesとは対照的に、ライン・バイ・ラインを返す静的ReadLinesメソッドを含みます配列を返すので、完全なファイルをメモリにロードする必要があります。それが必要なようだとして、元の質問については

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

、それは、line.StartsWithline.Containsを交換することによってさらに最適化することができますので、効率的かつ短いソリューションは、のように書くことができFile.ReadLinesとLINQを使用して

各行の冒頭にtermが表示されます。

関連する問題