5

インターンシップで作成しているプログラムについてサポートが必要です。アイデアは、ユーザーが任意のPCにログインする頻度を確認することです。ユーザーがログインすると、その情報はこの形式のようなテキストファイルに記録されます。

01-01-2011 16:47:10-002481C218B0-WS3092-Chsbe (XP-D790PRO1)

次に、テキストファイルを検索し、(たとえば)ユーザーChsbeのすべてのログイン日付についてテキストファイルを検索する必要があります。

これまでの私のコード:

private void btnZoek_Click(object sender, EventArgs e)
        {
            int counter = 0; string line;  
            // Read the file and display it line by line. 
            System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"); 
            while((line = file.ReadLine()) != null)
            {     if ( line.Contains(txtZoek.Text) )     
            {
                txtResult.Text = line.ToString();                
            }     

            }  
            file.Close(); 
        } 

私の質問は、検索語を含むログ内のすべての文字列をtxtResultに返すにはどうすればよいですか?

4

7 に答える 7

6

あなたはすでに良い仕事をしています。唯一のエラーは、テキストボックスに読み取られた最後の行の書き込みで、前の行が上書きされることです。次のように、 StringBuilder と使い捨ての Stream の周りにステートメント
を使用する必要があります。using

private void btnZoek_Click(object sender, EventArgs e)         
{             
    int counter = 0; string line;               
    StringBuilder sb = new StringBuilder();

    // Read the file and display it line by line.              
    using(System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"))
    {
       while((line = file.ReadLine()) != null)             
       {     
         if ( line.Contains(txtZoek.Text) )                  
         {          
              // This append the text and a newline into the StringBuilder buffer       
              sb.AppendLine(line.ToString());
         }                   
      }               
   }
   txtResult.Text = sb.ToString();
}  

もちろん、txtResult にはプロパティ MultiLine を true に設定する必要があります。そうしないと、出力を表示できません。ストリームを正しく閉じるように注意して予期しないファイル例外も自動的に処理するため、この種の状況を処理するためのより良い方法であることに注意して
くださいusing

于 2012-04-12T09:21:50.647 に答える
0

リストを定義する

リスト yourList = new List();

行 txtResult.Text = line.ToString(); を置き換えます。
yourList.Add(行);

リスト「yourList」で、ユーザーを含むすべての行を取得しました

于 2012-04-12T09:20:45.797 に答える
0

以下のようなものは、正規表現を始めるのに役立つかもしれません:

string pattern = "Chsbe"; 
Regex rx = new Regex(pattern, RegexOptions.IgnoreCase); 
MatchCollection mc = rx.Matches(inputText); 

foreach (Match m in mc) 
{ 
    Console.WriteLine(m.Value); 
} 
于 2012-04-12T09:21:08.950 に答える
0
private void btnZoek_Click(object sender, EventArgs e)
{
    int counter = 0; string line;  
    StringBuilder str = new StringBuilder();
    // Read the file and display it line by line. 
    System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"); 
    while((line = file.ReadLine()) != null)
    {
        if (line.Contains(txtZoek.Text))     
        {
            str.Append(line.ToString());                
        }     
    }  
    file.Close(); 
} 
于 2012-04-12T09:22:08.680 に答える
0

たぶん、このようなものがうまくいくでしょう。

    private void btnZoek_Click(object sender, EventArgs e)
    {
        int counter = 0; string line;  
        // Read the file and display it line by line. 
        System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"); 
        while((line = file.ReadLine()) != null)
        {     if ( line.Contains(txtZoek.Text) )     
        {
            txtResult.Text = txtResult.Text + Environment.Newline + line.ToString();                
        }     

        }  
        file.Close(); 
    } 

これは私のバージョンです:

    private void btnZoek_Click(object sender, EventArgs e)
    {
        try
        {
            int counter = 0;
            string line;
            List<String> LinesFound = new List<string>();

            // Read the file and display it line by line. 
            System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");

            while ((line = file.ReadLine()) != null)
            {
                if (line.Contains(txtZoek.Text))
                {
                    LinesFound.Add(line);
                }

            }
            file.Close();

            foreach (string Line in LinesFound)
            {
                txtResult.Text = txtResult.Text + Line + Environment.NewLine;
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Error in btnZoek_Click");
        }
    }

リストが非常に長い場合は、StringBuilder を使用して結果の文字列を作成し、パフォーマンスを高速化します。

于 2012-04-12T09:22:29.980 に答える
0

この行を変更してみてください ->

txtResult.Text = line.ToString();  

に:

txtResult.Text += line.ToString();  
于 2013-06-13T08:28:50.217 に答える
0

たとえば、リッチテキストボックスを使用するか、複数行のプロパティを使用します

private void btnZoek_Click(object sender, EventArgs e)
    {
        int counter = 0; string line;  
        // Read the file and display it line by line. 
        System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"); 
        while((line = file.ReadLine()) != null)
        {     if ( line.Contains(txtZoek.Text) )     
        {
            richtextbox1.Text += "\n" + line.ToString();
            txtresult.Text += "\n" + line.ToString();
        }     

        }  
        file.Close(); 
    } 
于 2012-04-12T09:18:58.057 に答える