none
Cómo leer una linea especifica de un archivo? en C# RRS feed

  • Pregunta

  • tengo un archivo el cual contiene varias lineas de caracteres. ejemplo: archivo.txt {a , b , c , d} ///Cada letra es una linea////

    lo que kiero es poder leer una o varias de esas lineas pero no todas, como por decir: leer la linea "a"  ó  leer linea "b" y "c" ... etc

    he buscado info pero me enseñan a leer todo el archivo " "".ReadToend""""" pero eso no es mi caso.

     

    Tengo otra pregunta: --------- como leo todos los archivos que están en una carpeta. Por ejemplo tengo una carpeta donde están todos mis contactos, cada uno esta en un archivo con su información, y kiero que me aparezca en un listbox (o algo parecido)  la lista de todos los contactos, ahí tendria q leer la primer linea(que es el nombre) del contacto y hacer eso para todos los archivos que contenga la carpeta.

    No se si se puede hacer esto, o habrá otra forma.  ME PUEDEN ORIENTAR POR FAVOR

    Espero su ayuda... Saludos


    • Editado wal26 viernes, 7 de octubre de 2011 0:34
    viernes, 7 de octubre de 2011 0:32

Respuestas

  • Puede leer línea por línea:

    StreamReader archivo = File.OpenText("miarchivo.txt");

    StreamReader archivo = File.OpenText("miarchivo.txt");
    string linea = null;
    int i = 0;
    while (!archivo.EndOfStream)
    {
        //Leer la 3ra línea:
        linea = archivo.ReadLine();
        if (++i == 3) break;
    }
    MessageBox.Show(linea);
    
    


    Como verá, no puede saltarse contenido, pero al menos puede contar líneas y detenerse en la que quiere.

    Para listar todos los archivos de un directorio:

    string[] archivos = Directory.GetFiles("C:\midirectorio");
    foreach (string archivo in archivos)
    {
        using(StreamReader arch = File.OpenText(archivo))
        {
            //Haga lo que tenga que hacer
            ... 
        }
    }
    
    



    Jose R. MCP
    viernes, 7 de octubre de 2011 0:41
    Moderador
  • :-)
    Hola,

    No puedes. Cuanquier técnica que utilices (leer el fichero a mano, a través de ODBC, o hasta en no muy conocido LINQ to text) se basan en a) una lectura secuencial o b) en leer todo el contenido y buscar en memoria la fila deseada.

    En cualquier caso no te preocupes, si el fichero no es muy grande el rendimiento suele ser bastante bueno. Yo he llegado a leer ficheros de 500.000 líneas en uno o dos segundos (con ReadAllLines):

    http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx

    var lines = File.ReadAllLines(filepath, Encoding.Default).ToList();
    

    Una vez en memoria es muy rápido buscar lo que deseas:

    var line = lines.FirstOrDefault(p => p.StartsWith("a"));
    

    Para ller todos los ficheros de una carpeta usa Directory.GetFiles:

    var files = Directory.GetFiles("D:\\", "*.txt").ToList();
    files.ForEach(f => AddToList(f));
    
    private void AddToList(string f)
    {
        listbox1.Items.Add(f);
    }
    

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Follow me on Facebook or Twitter!

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 7 de octubre de 2011 7:28
    Moderador
  • Una pequeña correción. En teoría si que puedes moverte por un archivo y leer solo las cosas que necesitas, utilizando el método Seek.

    http://msdn.microsoft.com/es-es/library/system.io.filestream.seek.aspx

    Pero claro, para saber que quieres leer y que no quieres leer lo tienes que tener apuntado en algún sitio. Normalmente esto se utiliza para ficheros que tienen una cabecera con el offset y la longitud de cada pedazo de informacíon que contienen (por ejemplo un archivo de recursos paquetizados todos juntos).


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    viernes, 7 de octubre de 2011 9:42

Todas las respuestas

  • Puede leer línea por línea:

    StreamReader archivo = File.OpenText("miarchivo.txt");

    StreamReader archivo = File.OpenText("miarchivo.txt");
    string linea = null;
    int i = 0;
    while (!archivo.EndOfStream)
    {
        //Leer la 3ra línea:
        linea = archivo.ReadLine();
        if (++i == 3) break;
    }
    MessageBox.Show(linea);
    
    


    Como verá, no puede saltarse contenido, pero al menos puede contar líneas y detenerse en la que quiere.

    Para listar todos los archivos de un directorio:

    string[] archivos = Directory.GetFiles("C:\midirectorio");
    foreach (string archivo in archivos)
    {
        using(StreamReader arch = File.OpenText(archivo))
        {
            //Haga lo que tenga que hacer
            ... 
        }
    }
    
    



    Jose R. MCP
    viernes, 7 de octubre de 2011 0:41
    Moderador
  • Buenas wal, para leer lineas utiliza ReadLine en vez de ReadToEnd y para obtener informacion de los archivos de una carperta usa la clase Directory.GetFiles.

    Un saludo,

    Miguel.


    viernes, 7 de octubre de 2011 0:43
  • :-)
    Hola,

    No puedes. Cuanquier técnica que utilices (leer el fichero a mano, a través de ODBC, o hasta en no muy conocido LINQ to text) se basan en a) una lectura secuencial o b) en leer todo el contenido y buscar en memoria la fila deseada.

    En cualquier caso no te preocupes, si el fichero no es muy grande el rendimiento suele ser bastante bueno. Yo he llegado a leer ficheros de 500.000 líneas en uno o dos segundos (con ReadAllLines):

    http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx

    var lines = File.ReadAllLines(filepath, Encoding.Default).ToList();
    

    Una vez en memoria es muy rápido buscar lo que deseas:

    var line = lines.FirstOrDefault(p => p.StartsWith("a"));
    

    Para ller todos los ficheros de una carpeta usa Directory.GetFiles:

    var files = Directory.GetFiles("D:\\", "*.txt").ToList();
    files.ForEach(f => AddToList(f));
    
    private void AddToList(string f)
    {
        listbox1.Items.Add(f);
    }
    

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Follow me on Facebook or Twitter!

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 7 de octubre de 2011 7:28
    Moderador
  • Una pequeña correción. En teoría si que puedes moverte por un archivo y leer solo las cosas que necesitas, utilizando el método Seek.

    http://msdn.microsoft.com/es-es/library/system.io.filestream.seek.aspx

    Pero claro, para saber que quieres leer y que no quieres leer lo tienes que tener apuntado en algún sitio. Normalmente esto se utiliza para ficheros que tienen una cabecera con el offset y la longitud de cada pedazo de informacíon que contienen (por ejemplo un archivo de recursos paquetizados todos juntos).


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    viernes, 7 de octubre de 2011 9:42
  • :)
    Hola Vicente,

    Si, es cierto que existe Seek... Pero no puede usarse en el contexto que wal26 indicaba.

    De todos modos, gracias por el apunte.


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Follow me on Facebook or Twitter!

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 7 de octubre de 2011 9:48
    Moderador
  • lo de leer una linea especifica no me funciono,

    me lee todo el archivo

    jueves, 13 de octubre de 2011 0:40
  • Es muy simple, es un algoritmo primero buscas la direccion del archivo y la guardas en una variable, luego abres filestream que lo que abre el texto, despues defines filereader que es lo que lee el texto y despues usas programacion basica para manipular el archivo. espera que sea util, saludos...

    string fileName = (path);//establece la direccion donde se encuentra el erchivo
                FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);//esto es lo que abre el archivo
                StreamReader reader = new StreamReader(stream);//esta es una variable para poder manipular la informacion
                string linea = null;//variable para manipular las lineas
                int i = 0;//variable para contar las lineas
                while (!reader.EndOfStream)
                {
                    //Leer la 3ra línea:
                    linea = reader.ReadLine();
                    if (++i == 4) break;//aqui pones la linea que deseas contar
                }
                //label1.Text = linea;
                //aqui pones donde quieres que se muestre la linea ya sea textbox, label etc

    martes, 19 de noviembre de 2019 14:01