En ocasiones tendrás que trabajar con archivos delimitados por algún carácter. Por lo general, estos archivos son utilizados en sistemas que no se actualizaron o se quedaron sin actualizar. El dia de hoy trabajaremos con el sitio de códigos postales de México, donde te ofrece la posibilidad de descargar un archivo de texto delimitado por el carácter '|'.
Te dejo un enlace al sitio para que descargues el archivo AQUÍ.
Para comenzar necesitarás crear un proyecto C# con Windows Forms.
Después deberás generar una interfaz igual o parecida a la que se muestra en la imagen de arriba. Esta deberá contener lo siguiente:
- Una etiqueta con el texto "Archivo:"
- Un cuadro de texto (textBox)
- Un botón con el texto "Examinar..."
- Un DataViewGrid con las siguientes columnas:
♦ d_codigo
♦ d_asenta
♦ d_tipo_asenta
♦ D_mnpio
♦ d_estado
♦ d_ciudad
♦ d_CP
♦ c_estado
♦ c_oficina
♦ c_tipo_asenta
♦ c_mnpio
♦ id_asenta_cpcons
♦ d_zona
♦ c_cve_ciudad
♦ c_CP
En la siguiente imagen se muestra la manera de agregarle columnas.
Ahora bien vamos a generar el evento del clic del botón, en donde instanciamos un "openFileDialog" para que puedas seleccionar el archivo a leer, ahi tambien se definirá el directorio inicial y el filtro para que solo se puedan seleccionar archivos de texto, de la siguiente manera.
Dentro del "if" agregaremos un "try-catch" por si llegase a ocurrir un error, generamos una variable de tipo cadena "str_ruta" que es donde se almacenara la ruta del archivo seleccionado, despues esta variable ser mostrara en el cuadro de texto solo como referencia.
Para leer el archivo, generamos un metodo publico que recibira la ruta del archivo y retorna un "true" si el archivo pudo ser leído o un "false" si ocurrió un error.
Para leer el archivo se utilizará "readAllLines" que regresa un arreglo de cadenas con las líneas del archivo, las cuales convierto a una lista.
Después de leer el archivo, generó una validación con un "if" en la cual cuento los elementos del listado. Si el listado contiene más de 0 elementos entonces pasará a la siguiente etapa.
En la siguiente etapa eliminó los primeros dos elementos de la lista por que son los encabezados que tiene el DataViewGrid, también genero un contador para obtener los valores que cumplan con los requisitos.
Ahora bien, realizó un ciclo "foreach" en el cual recorro cada uno de los elementos del listado. Dentro de la iteración del ciclo, genero un listado de cadenas en el cual almacenare los resultados de cada columna, para ello uso "split" y le indico cual es el carácter que divide, esto retorna un arreglo con cada uno de los elementos del renglón. Si el listado contiene 15 elementos, entonces este se mostrara en el dataviewgrid.
Después generó una validación, en donde si el contador "int_positivos" es mayor que 0, entonces el valor retornado sera "True", si no, sera "False".
Después lo consumo desde el evento del clic, enviando la ruta del archivo. Si es falso se mostrará un mensaje de error.
Para finalizar, te dejo la ejecución del programa y el código del proyecto en la parte de abajo.
Código:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace leer_split { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFile = new OpenFileDialog(); openFile.InitialDirectory = "C:\\"; openFile.Filter = "Archivos de texto|*.txt"; string str_ruta = string.Empty; if (openFile.ShowDialog() == DialogResult.OK) { try { str_ruta = openFile.FileName; textBox1.Text = str_ruta; bool bol_lectura = leerArchivo(str_ruta); if (!bol_lectura) { MessageBox.Show("El archivo no contiene el formato correcto, por favor, vuelve a intentarlo"); } } catch (Exception) { MessageBox.Show("Error al leer el archivo, intentalo de nuevo..."); //throw; } } } public bool leerArchivo(string str_ruta) { bool bol_correcto = false; Listlis_renglones = new List (); try { lis_renglones = System.IO.File.ReadAllLines(@"" + str_ruta).ToList(); if (lis_renglones.Count != 0) { lis_renglones.RemoveRange(0, 2); int int_positivo = 0; foreach (var item in lis_renglones) { List lis_datos = new List (); lis_datos = item.Split('|').ToList(); if (lis_datos.Count == 15) { int_positivo++; dataGridView1.Rows.Add(lis_datos.ToArray()); } if (int_positivo > 0) { bol_correcto = true; } else { bol_correcto = false; } lis_datos.Clear(); } } else { bol_correcto = false; } } catch (Exception) { bol_correcto = false; } return bol_correcto; } } }
Comentarios