Abrir y parsear un archivo en C# con Visual Studio 2019.

Fecha de Publicación: 2020-09-11

Introducción

En este ejercicio abriremos un archivo y alojaremos su contenido en una lista de objetos en C#

Requisitos

  • Visual Studio Community 2019
  • Archivo para abrir y parsear el cual se puede descargar de la pagina indicada en la sección Referencias al final de este post



Resultado

La siguiente imagen muestra lo que obtendremos al realizar este ejercicio:





Codigo Fuente

Descargar

Ejercicio

Comenzaremos como siempre abriendo nuestro Visual Studio y creando nuestra solución con un proyecto de consola para este ejemplo lo llamare OpenAndParseFile. Si no tienes conocimiento de como crearlo te dejo el link donde puedes aprender como hacerlo y regresar despues a este ejercicío.





Lo que haremos ahora es instalar nuestra libreria System.Configuration desde nuestro Explorador de soluciones, esto lo realizamos de la siguiente manera. Nos posicionamos en Explorador de soluciones damos clic Referencias despues Agregar referencia...y damos clic.



Nos aparecera una ventana llamada Administrador de referencias: (Nombre del proyecto) donde nos permitiria visualizar nuestras referencias instaladas, nos posicionaremos en el menu Ensamblados -> Framework y buscamos System.Configuration damos clic sobre el y tiene que aparecer una palomita como en la imagen, finalmente damos clic en Aceptar.



Una vez que terminado el proceso de poner la referencia en nuestro Explorador de soluciones en Referencias deberemos visualizar que la referecnias se encuentra en nuestro proyecto como se muestra en la imagen.



El siguiente paso es abrir nuestro archivo App.config y agregaremos una sección de appSettings y dentro de esta sección una key con la dirección de nuestro archivo con el que trabajaremos como se muestra en la imagen..



Abriremos nuestra clase Program y comenzaremos declarando una variable tipo string y despues la instrucción:

    
      strPathFile = ConfigurationManager.AppSettings["PathFile"].ToString();
    
  

Con la que indicamos que tome del archivo App.config de la sección appSettings la key llamada PathFile y la convierta a una cadena de texto.



Despues declaramos otra variable tipo string en la cual alojaremos el contenido del archivo que abriremos, la instrucción con la que abrimos el archivo es la siguiente:

    
      strBuffer = File.ReadAllText(strPathFile);
      
    


Lo siguiente es analizar nuestro archivo el cual vamos a parsear, lo abrimos y visualizamos la información de aqui se puede deducir lo siguiente:

  • Es un archivo separado por comas.
  • La primer linea contiene los titulos de las columnas y al parecer son de datos de personas.
  • El separador de lineas es el caracter LF (Line Feed).


  • Con este analisis ya podemos realizar nuestro codigo para parsear el archivo para lo cual crearemos una clase que contenga las propiedades de la persona de acuerdo a nuestro archivo y posteriormete de ese objeto Person crearemos una lista para alojar todos los datos del archivo, para ello nos posicionaremos en nuestro proyecto y daremos clic derecho sobre el, despues buscaremos Agregar y dentro de agregar Nuevo elemento ....



    Una vez que nos muestra la ventana de Agregar nuevo elemento buscamos Elementos de Visual C# y despues seleccionamos Clase, escribimos su nombre Person y finalmente damos clic en Agregar.



    Abrimos nuestra clase Person y comenzamos a declarar sus propiedades de acuerdo al analisis previo del archivo los cuales son:



    • Vacio
    • First Name
    • Last Name
    • Gender
    • Country
    • Age
    • Date
    • Id
    Al finalizar nuestra declaración de propiedades tendremos algo parecido a lo siguiente:

    Te dejo el link con el codigo de la clase finalizado.



    Nos regresamos a nuestra clase Program.cs y declaramos una lista vacia con objetos tipo Person

        
          List'<'Person'>' lst = null;
          
        


    creamos un metodo ParseData donde enviaremos nuestro texto almacenado previamente en la variable strBuffer y retornaremos una lista de tipo Person.
        
            private static List'<'Person'>' ParseData(string strBuffer)
            {
                throw new NotImplementedException();
            }
          
        



    Bien, lo que sigue es modificar el metodo ParseData, lo que haremos es separar primero nuestro texto en lineas, esto lo hacemos con la funcion Split y un foreach para iterar el resultado del Split quedando de la siguiente forma:

        
              foreach (string str in strBuffer.Split(new char[] { '\n' }, StringSplitOptions.None))
              {
    
              }
            
        
    Recuerda que para separar las lineas observamos que el caracter que las separa es LF eso se traduce como un \n en el codigo de .csharp.



    En este momento ya tenemos separadas las lineas, ahora separaremos los campos de nuestro archivo, el cual sera con el caracter , (coma) que esta definido como separador de nuestro archivo.

        
            string[] aryStr = str.Split(",", StringSplitOptions.None);
          
        
    Nuevamente utilizamos el metodo Split para separar nuestra linea pero en este caso sera un arreglo donde se alojaran los resultados obtenidos por este.



    Solo nos queda guardar los resultados de los campos de acuerdo a su posición en el arreglo, para ello ocuparemos un for y un switch , el primero lo iteraremos para ir accediendo a cada posición del arreglo y el segundo para ir alojando de acuerdo a la posición el campo correspondiente en un objeto tipo Person previamente creado.





    Al finalizar el recorrido del for guardamos los campos obtenidos en la lista que regresaremos al finalizar el recorrido de todas las lineas del buffer

        
          lst.Add(p);
        
      


    En la imagen siguiente se muestra como queda el metodo completo con todos los campos ya declarados, existen datos diferentes a cadenas de texto los cuales se tienen que convertir a su tipo correspondiente ellos son: int, date, para convertirlos a sus respectivos tipos se ocupan las siguientes instrucciones:

        
            int nIsNum = 0;
            DateTime dt = new DateTime(1900, 1, 1);
    
            //Numeros
            int.TryParse(aryStr[i], out nIsNum);
            //Fechas
            DateTime.TryParse(aryStr[i], out dt);  
          
        



    Ya para finalizar ponemos un punto de interrupción en nuestro codigo en el metodo Main despues de esta instrucción

        
            lst = ParseData(strBuffer);
          
        
    y probamos nuestra aplicación, como podemos visualizar se llena la lista con los campos correctamente y no marca ningun error.





    Y con esto hemos finalizado el ejercicio!!!

    Muchas gracias y si te fue util el ejercicio por favor hazmelo saber en las formas de contacto que se muestran en la parte inferior.

    Hasta la proxima.

    Referencias