none
Saber la línea de un fichero donde se encuentra una palabra RRS feed

  • Question

  • Buenos días a todos/as

    Estoy haciendo una pequeña aplicación de consola para recorrer todos los ficheros de una ruta y si encuentra alguna palabra que yo le digo, me escriba el texto donde aparece la palabra y el número de linea del fichero donde aparece y escriba en un nuevo fichero, tanto el texto, como el número de linea donde aparece.  

    Encontré ésto buscando por aquí:

    https://social.msdn.microsoft.com/Forums/vstudio/es-ES/fc4e8b1c-61e0-4b8c-9fa6-be40be1538c0/buscar-palabra-en-erchivos?forum=vcses

    Siguiendo ese ejemplo, tengo lo siguiente:

    static void Main(string[] args)
            {
                string[] files = Directory.GetFiles(@"C:\Proyectos", "*.cs");
    
                List<string> encontradosSelect = new List<string>();
                List<string> encontradosUpdate = new List<string>();
                List<string> encontradosInsert = new List<string>();
                List<string> encontradosDelete = new List<string>();
    
                foreach (var file in files)
                {
    
                    string contenido = File.ReadAllText(file);
    
                    if (contenido.Contains("select") || contenido.Contains("Select") || contenido.Contains("SELECT"))
                    {
                        encontradosSelect.Add(file);
                    }
    
                    if (contenido.Contains("update") || contenido.Contains("Update") || contenido.Contains("UPDATE"))
                    {
                        encontradosUpdate.Add(file);
                    }
    
                    if (contenido.Contains("insert") || contenido.Contains("Insert") || contenido.Contains("INSERT"))
                    {
                        encontradosInsert.Add(file);
                    }
    
                    if (contenido.Contains("delete") || contenido.Contains("Delete") || contenido.Contains("DELETE"))
                    {
                        encontradosDelete.Add(file);
                    }
                }
            }

    Alguna idea de cómo conocer el número de linea donde encuentro las palabras que estoy buscando??

    Un saludo!

    Thursday, April 2, 2020 9:51 AM

Answers

  • hola

    >>Alguna idea de cómo conocer el número de linea donde encuentro las palabras que estoy buscando

    deberias cambiar el ReadAllText() por ReadAllLines() entonces buscar por linea

    Si queires programarlo algo un poco mas orientado a objetos podrias definir una estructura como ser

    public Item
    {
    	public string Operacion {get;set;}
    	public int linea {get;set;}
    }
    public class FileInfo
    {
    	public string File {get;set;}
    	public List<Item> Items {get;set;}
    }

    entonces iteras las lineas

    static void Main(string[] args)
    {
    	List<string> Operaciones = new List<string>() {"SELECT", "UPDATE", "INSERT", "DELETE" };
    	List<FileInfo> listFiles = new List<FileInfo>();
    	
    	string[] files = Directory.GetFiles(@"C:\Proyectos", "*.cs");
    
    	foreach (var file in files)
    	{
    		FileInfo f = new FileInfo();
    		f.File = file;
    		f.Items = new List<Item>();
    		
    		string[] lineas = File.ReadAllLines(file);
    		
    		int index = 1;
    		foreach(string linea in lineas)
    		{
    			foreach(string operacion in operaciones)
    			{
    				if(linea.IndexOf(operacion, StringComparison.InvariantCultureIgnoreCase) >= 0)
    				{
    					f.Items.Add(new Item() { Operacion = operacion, linea = index});
    				}
    			}
    			index++;
    		}
    		
    		listFiles.Add(f);
    	}
    }

    puedes tener una lista de operacion para buscar por estas en lugar de tener tantos if

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Thursday, April 2, 2020 12:42 PM

All replies

  • hola

    >>Alguna idea de cómo conocer el número de linea donde encuentro las palabras que estoy buscando

    deberias cambiar el ReadAllText() por ReadAllLines() entonces buscar por linea

    Si queires programarlo algo un poco mas orientado a objetos podrias definir una estructura como ser

    public Item
    {
    	public string Operacion {get;set;}
    	public int linea {get;set;}
    }
    public class FileInfo
    {
    	public string File {get;set;}
    	public List<Item> Items {get;set;}
    }

    entonces iteras las lineas

    static void Main(string[] args)
    {
    	List<string> Operaciones = new List<string>() {"SELECT", "UPDATE", "INSERT", "DELETE" };
    	List<FileInfo> listFiles = new List<FileInfo>();
    	
    	string[] files = Directory.GetFiles(@"C:\Proyectos", "*.cs");
    
    	foreach (var file in files)
    	{
    		FileInfo f = new FileInfo();
    		f.File = file;
    		f.Items = new List<Item>();
    		
    		string[] lineas = File.ReadAllLines(file);
    		
    		int index = 1;
    		foreach(string linea in lineas)
    		{
    			foreach(string operacion in operaciones)
    			{
    				if(linea.IndexOf(operacion, StringComparison.InvariantCultureIgnoreCase) >= 0)
    				{
    					f.Items.Add(new Item() { Operacion = operacion, linea = index});
    				}
    			}
    			index++;
    		}
    		
    		listFiles.Add(f);
    	}
    }

    puedes tener una lista de operacion para buscar por estas en lugar de tener tantos if

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Thursday, April 2, 2020 12:42 PM
  • Genial Leandro, funcionó!!

    Otra pregunta al hilo de ésto y abusando de tu confianza: el resultado lo estoy sacando en un fichero, pero si la sentencia que yo busco tiene varias líneas (lo típico que separamos una sentencia en varias líneas para no tener scroll horizontal), cómo haría para sacar la sentencia entera??. Ejemplo:

    C:\Proyectos\Archivo.cs
                                "UPDATE #INST#ESRD SET ESRDFECL = '" + DateTime.Now.ToString("yyyyMMdd") + "', ESRDOFIN='O' WHERE " +
    C:\Proyectos\Otroarchivo.cs

    Si nos fijamos, vemos que la sentencia SQL no aparece entera (se corta a partir del where); solo hasta donde llega esa línea donde está la ocurrencia. Habría alguna forma de sacar toda la sentencia SQL?? Algo así como que coja la línea hasta el siguiente ";"?? No se si me explico...

    Muchas gracias y un saludo

    Thursday, April 2, 2020 2:02 PM
  • hola

    >>Habría alguna forma de sacar toda la sentencia SQL?? Algo así como que coja la línea hasta el siguiente ";"?

    pero entonces no deberias trabajr linea a linea sino realizar un Split por el punto y coma, entendiendo que cada ";" representa una sentencia sql

    quizas debas cambiar

    string[] lineas = File.ReadAllLines(file);

    por

    string contenido =  File.ReadAllText(file);

    string[] sentencias = contenido.Split(';');

    entonces iteras las sentencias que obtienes del contenido del archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Thursday, April 2, 2020 2:08 PM
  • Muchas gracias Leandro! 
    Thursday, April 2, 2020 2:37 PM
  • Hola

     

     

    Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

     

    Siempre es un placer atender tus consultas!

     

    Gracias por usar los foros de MSDN.

     

    Oscar Navarro

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. 

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    Monday, April 6, 2020 4:47 PM
    Moderator