2012-04-12 14 views
5

Necesito ayuda con un programa que estoy desarrollando en mi pasantía. La idea es comprobar la frecuencia con la que un usuario inicia sesión en cualquier PC. Cuando un usuario inicia sesión, esa información se registra en un archivo de texto, como este formato.C# archivo de texto de búsqueda, devuelva todas las líneas que contengan una palabra

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

ahora tengo que buscar el archivo de texto y (por ejemplo) busque en el archivo de texto para todas las fechas de inicio de sesión para el usuario Chsbe.

Mi código hasta ahora:

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

Mi pregunta es, ¿Cómo puedo devolver todas las cadenas en el registro que contiene el término de búsqueda a txtResult?

+1

mirada en expresiones regulares –

+0

personal ¿Se possbile obtener el código fuente como XML? De lo contrario, como se mencionó anteriormente, vea regex. Si las búsquedas se vuelven más complejas eche un vistazo a algún tipo de componentes de búsqueda de texto completo –

Respuesta

6

que ya está haciendo un buen trabajo. El único error está en la escritura de la última línea leída en el cuadro de texto que sobrescribe la anterior.
Es necesario utilizar un StringBuilder y una declaración using alrededor de su corriente disponible de la siguiente manera:

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

por supuesto, su txtResult debería tener la línea múltiple de propiedad establecido en true, de lo contrario no será capaz de ver la salida.
Tenga en cuenta que using es la mejor manera de manejar este tipo de situaciones, ya que se encarga de automatizar también excepciones de archivos inesperados, teniendo cuidado de cerrar correctamente su torrente

+0

¡Sí! ¡eso es todo! Gracias por la ayuda rápida, Steve. – Ralph

0

Uso RichTextBox o usar la propiedad de varias líneas por ejemplo

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(); 
    } 
+0

¿Quiere decir Richtextbox? – basti

+0

Ohh, sí, señorita, haga clic en – Likurg

+0

Por cierto. No creo que esto sea de mucha ayuda para la treadstarter. Al menos deberías llamar al nombre de la clase. Enlace al MSDN o muestre la inicialización ... ... que explicaría más y que también existiría el "por qué" usar richtextbox. – basti

0

definir una lista de

Lista yourList = nueva lista();

Reemplace la línea txtResult.Text = line.ToString();
por yourList.Add (línea);

en la lista de "yourList" que tiene todas las líneas que contienen el usuario

+0

Intenté esto pero no hará una lista ... ¿puede aclarar esto? – Ralph

+0

¿Cómo está tu código? – sebastianmehler

0

algo como el siguiente podría ayudar a empezar con expresiones regulares:

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

foreach (Match m in mc) 
{ 
    Console.WriteLine(m.Value); 
} 
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(); 
} 
0

Tal vez algo como esto iba a funcionar.

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

Esto sería mi versión:

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

Si la lista es muy larga me gustaría utilizar un StringBuilder para crear una cadena como resultado una aceleración del rendimiento.

0

trate de cambiar esta Línea ->

txtResult.Text = line.ToString(); 

a:

txtResult.Text += line.ToString(); 
Cuestiones relacionadas