2016-08-19 6 views
2

したがって、テキストファイルを読み込んで特定の文字列のインスタンスを確認するコードを書きました。その文字列が存在する場合は、アクションを実行する必要があります。私はいくつかのメッセージボックスを追加して、私に機能の進捗状況を知らせました。問題は、言葉が見つからないということです。ここに私のコードです:テキストファイルを検索して見つかった場合にアクションを実行するコードが失敗する

private void test2_Click(object sender, EventArgs e) 
{ 
    StreamReader objReader = new StreamReader("C:\\testing\\mslogon.log"); 
    string sLine = ""; 
    ArrayList arrText = new ArrayList(); 
    MessageBox.Show("File Read"); 

    while (sLine != null) 
    { 
     sLine = objReader.ReadLine(); 
     if (sLine != null) 
     { 
      arrText.Add(sLine); 
     } 
    } 

    if (arrText.Contains("Invalid")) 
    { 
     MessageBox.Show("Word Invalid Found"); 
    } 
    else 
    { 
     MessageBox.Show("Nada"); 
    } 
} 

答えて

2

問題arrText.Contains("Invalid")をすることによって、あなたは、「無効」のarrayの各要素を検索しているということですので、あなたは、そのテキストを使用して、テキストファイル内の1行を持っていない限り、それを発見されません。

を検索する必要があります。アレイを構築するときに、そこにフラグを設定してください。

var isFound = false; 
var searchPhrase = "Invalid"; 

while (sLine != null) 
{ 
    sLine = objReader.ReadLine(); 
    if (sLine != null) 
    { 
     arrText.Add(sLine); 
     if (sLine.Contains(searchPhrase)) isFound = true; 
    } 
} 

if (isFound) 
{ 
    MessageBox.Show("Word Invalid Found"); 
} 
else 
{ 
    MessageBox.Show("Nada"); 
} 
+0

「無効」という言葉よりも多くの行が含まれている場合や、何か別のことをする必要がある場合は、そのように機能しますか? –

+0

私はそれが複数の無効を含むかどうかを気にするかどうかによって異なります。どちらの方法でも動作します。 –

3

今のところ、「無効」と正確に等しい要素のarrTextを確認しています。大きな文字列に "無効"が埋め込まれていると、それが見つからなくなります。文字列のいずれかが無効含んで、あなたがする必要があるだろうかどうかを確認するには

foreach(var line in arrText) 
{ 
    if (line.Contains("Invalid")) { MessageBox.Show("Word 'Invalid' Found"); break; } 
} 

@Alexeiが言及としてFile.ReadAllTextを使用するには、あなたがやりたいと思っている何かをすることができますでしょうとなりますこのような何か:あなたのファイルが非常に大きくない

String wholeFile = File.ReadAllText(); 
if (wholeFile.Contains("Invalid")) { 
    MessageBox.Show("Word 'Invalid' Found"); 
} else { 
. . . 
+0

これは私にとって最高のソリューションのようです。ファイルの内容を配列にダンプする必要がなくなり、すぐに私の答えを得ることができます。 –

1

場合は、File.ReadAllText機能を使用して一度にすべてのテキストを読んでみてください。

また、デフォルトでは、大文字と小文字を区別して検索されるため、「無効な単語が見つかりません」というエラーが発生します。

2

はこれを試してみてください。

private void test2_Click(object sender, EventArgs e) 
{ 
    StreamReader objReader = new StreamReader("C:\\testing\\mslogon.log"); 
    string sLine = ""; 
    ArrayList arrText = new ArrayList(); 
    MessageBox.Show("File Read"); 

    while (sLine != null) 
    { 
     sLine = objReader.ReadLine(); 
     if (sLine != null) 
     { 
      arrText.Add(sLine); 
     } 
    } 
    foreach(string x in arrText) 
    { 
     if (x.Contains("Word Invalid Found")) 
     { 
     MessageBox.Show("Nothing Found"); 
     } 
     else 
     { 
     MessageBox.Show("Nada"); 
     } 
    } 
} 
0

あなたは、あなたの実際のコードでは、配列の各項目に正確な内容の「無効」に動作すると文字列のみを検索する必要があります。

LINQを使用して、あなたはこれを行うことができます。

if (arrText 
     .ToArray() 
     .Where(p => ((string)p).Contains("Invalid")).Any()) 
    { 
     MessageBox.Show("Word Invalid Found"); 
    } 
1

あなたのコードでは、あまりにも多くの仕事をしています。ファイルに「無効」という単語が含まれているかどうかを知りたい場合は、ファイル全体を一度に読む必要はありません。そして、あなたが見つける最初の行に止めることができます。この考えてみましょう:

bool found = false; 
var lines = File.ReadLines(@"c:\testing\mslogon.log"); 
foreach (var sLine in lines) 
{ 
    if (sLine.IndexOf("Invalid") != -1) 
    { 
     found = true; 
     break; 
    } 
} 
if (found) 
{ 
    MessageBox.Show("Found it!"); 
} 
else 
{ 
    MessageBox.Show("Not found."); 
} 

をそして、あなたは、LINQの式でforeachことを置き換えることができます:ここ

bool found = lines.Where(sLine => sLine.IndexOf("Invalid") != -1).Any(); 

キーは、File.ReadLinesが一度にファイルを一行を読み込むことができます列挙子を作成することですファイル全体をメモリにロードするのではなく、ループ内で、breakは、行が見つかると、ループを早期に終了します。 LINQの式では、Anyメソッドは本質的に同じものです。最初の行に "無効"が見つかった場合、残りのファイルを読む必要はありません。