Facebook Google+


Ingreso, búsqueda y eliminación de datos en TXT con C#
#1
Me pueden desde ya preguntar por qué no puse "CRUD" en el título, la razón es que el autor olvidó el método udpate() o modificar aunque igualmente tiene varias fallas más...

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace eegistro
{
    class Program
    {
        static String archivo = @"d:\archivo.txt";
        static String archivotemp = @"d:\archivotemp.txt";
        static void Main(string[] args)
        {



            ingreso(archivo);
          //  muestradatos(archivo);
            //modifica(archivo);
            //eliminarLinea();

            Console.ReadKey();
        }

        public static void ingresodatos(String archivo, String linea)
        {
            StreamWriter fichero;
            fichero = File.AppendText(archivo);
            fichero.WriteLine(linea);
            fichero.Close();
        }
        public static void muestradatos(String archivo)
        {
            StreamReader fichero;
            fichero = File.OpenText(archivo);
            String linea = null;
            do
            {
                linea = fichero.ReadLine();
                Console.WriteLine("" + linea);
            }
            while (linea != null);
            fichero.Close();
            Console.ReadKey();
        }

        public static void buscarLinea()
        {
            Console.WriteLine("PALABRA A BUSCAR");
            string palabraBuscada = Console.ReadLine();
            StreamReader fichero_lectura = new System.IO.StreamReader(archivo);
            String linea;
            while ((linea = fichero_lectura.ReadLine()) != null)
            {
                if (linea.Contains(palabraBuscada))
                    Console.WriteLine(linea);
            }
            fichero_lectura.Close();
        }

        public static void eliminarLinea()
        {
            Console.WriteLine("LINEA A ELIMINAR");
            string palabraBuscada = Console.ReadLine();
            StreamReader fl = new StreamReader(archivo);
            String linea;
            using (StreamReader r = new StreamReader(archivo))
            {
                using (StreamWriter writer = new StreamWriter(archivotemp))
                {
                    while ((linea = r.ReadLine()) != null)
                    {
                        if (!linea.Contains(palabraBuscada))
                            writer.WriteLine(linea);
                    }
                }
            }
            fl.Close();
            eliminarArchivo(archivo);
            File.Copy(archivotemp, archivo);
            eliminarArchivo(archivotemp);
        }
        public static void eliminarArchivo(String direccion)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo(direccion);
            try
            {
                fi.Delete();
            }
            catch (System.IO.IOException e)
            {
                Console.WriteLine(e.Message);
            }
        }
      
        public static void ingreso(String archivo)
        {
            String Nombres, Apellidos, Cedula, Ciudad_Nacimiento, Fecha_Nacimiento;

            Console.WriteLine("Ingrese Sus Nombres:");
            Nombres = Console.ReadLine();

            Console.WriteLine("Ingrese Sus Apellidos:");
            Apellidos = Console.ReadLine();

            Console.WriteLine("Ingrese Su Numero de Cedula:");
            Cedula = Console.ReadLine();

            Console.WriteLine("Ingrese Su Ciudad donde Nacio:");
            Ciudad_Nacimiento = Console.ReadLine();

            Console.WriteLine("Ingrese Su Fecha de Nacimiento:");
            Fecha_Nacimiento = Console.ReadLine();

            ingresodatos(archivo, Cedula + " " + Nombres + " " + Apellidos + " " + Fecha_Nacimiento + "" + Ciudad_Nacimiento);
        }
        
          
}
        }


Quien me consultó me dijo "conseguí esto pero solo me funciona en consola" y mi respuesta en pocas palabras fue:


1) Haces "prints" (uso de WriteLine) dentro de las funciones y de por sí constituye una mala práctica contra el re-uso y la posibilidad de decorar los resultados, solo por eso funciona solo en consola........ ejemplo en buscarLinea()

2) El ingreso() lee varios campos (no veo un struct por ningún lado) pero luego solo busca y elimina por linea

Lo bueno es que ha sido una mejora importante respecto de lo primero que mostró:

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;
using System.IO;
namespace WindowsFormsApplication1
{
    public partial class Agregar : Form
    {
        public Agregar()
        {
            InitializeComponent();
          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            String nombres, apellido, cedula, c_nacimiento, f_nacimiento;
            String ruta = @"C:\deberes\kerly.txt";
            String temp = @"C:\deberes\temporal.txt";
            nombres = NOMBRES.Text;
            apellido = textBox2.Text;
            cedula = textBox3.Text;
            c_nacimiento = textBox4.Text;
            f_nacimiento = textBox5.Text;
            MessageBox.Show("BIEN");
           ingreso(ruta,"N:"+nombres+",A:"+apellido+",C:"+cedula+",FN:"+f_nacimiento+",CN:"+c_nacimiento);
            NOMBRES.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
            textBox5.Clear();
            if(File.Exists(temp))
            {

            }
            else
            {
                File.WriteAllText(temp,ruta);
            }
        }
        public static void ingreso(String ruta, String mensaje)
        {
            StreamWriter ingresar;
            ingresar = File.AppendText(ruta);
            ingresar.Write(mensaje);
            ingresar.Close();
        }
        public static void trabajo(String ruta,String mensaje)
        {
            try
            {
                StreamReader leer;
                leer = File.OpenText(mensaje);
                String linea;
                do
                {
                    linea = leer.ReadLine();
                    Console.WriteLine(linea);

                } while (linea != null);
                leer.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("!ERROR " + e);
            }
        }
    }
}

Allí estaba hardcodeando los nombres de los archivos DENTRO de las funciones y tenia muchas dependencias respecto del funcionamiento de un formulario. En el codigo mejorado también hardcodea el nombre de los archivos pero ya no es dentro de las funciones, es una mejora despues de todo Smile
 
Reply
#2
Para reutilizar esos metodos en Windows Forms o WPF es necesario además que se separen de la clase "Programa", crear otra clase (llamada por ejemplo "UtilidadArchivos") y ésta otra puede ser estática obviamente.
 
Reply
#3
OSEA CADA METODO LO USARE EN UN BOTON PRIMERO DEBO CREAR UNA CLASE CON ESE METODO VERDAD
 
Reply
#4
Debes hacer una llamada a la funcion que necesitas dentro de esa clase (que como te decia no contien un Main() ya que es solo una libreria), ejemplo desde un formulario:

Código:
button1_click( .......){
      nombre_clase.metodo(parámetros);
}

O sea que no haces nombre_instancia.método() sino nombre_clase.metodo(), y todos los metodos relacionados con cierta funcionalidad estan agrupados en una clase para eso son despues de todo.
 
Reply
#5
(12-26-2016, 03:28 PM)Dev escribió:
Código:
button1_click( .......){
      nombre_clase.metodo(parámetros);
}



Código:
private void button4_Click(object sender, EventArgs e)
{
            cargarArchivo();
}

SI ESO SI ESTOY MANEJANDO LO QUE QUIERO ES Q ESTE CODIGO DE AQUI ESTA FUNCION 

Código:
 public static void buscarLinea()
        {
        
            string palabraBuscada = Console.ReadLine();
            StreamReader fichero_lectura = new System.IO.StreamReader(archivo);
            String linea;
            while ((linea = fichero_lectura.ReadLine()) != null)
            {
                if (linea.Contains(palabraBuscada))
                    Console.WriteLine(linea);
            }
            fichero_lectura.Close();
        }

// ESTO SOLO USA EN CONSOLA QUIERO Q ME SIRVA EN FORMULARIO LLAMANDOLO DESDE UN DATAGRID
 
Reply
#6
Código:
private void button4_Click(object sender, EventArgs e)
{
            cargarArchivo();
}

Ahi tienes que pasar parámetros, sino de una forma u otra estas "hardcodeando" el nombre del archivo, la idea es que le digas que archivo cargar:

Código:
private void button4_Click(object sender, EventArgs e)
{
            cargarArchivo("d:\\archivo.txt");
}

Lo del DataGridView me fijo como es Smile
 
Reply
#7
Código:
private void button4_Click(object sender, EventArgs e){
     cargarArchivo("d:\\archivo.txt");
}

ESTA FUNCION ME SIRVE SI MUY BN LLAMANDOLA  LA FUNCION ES LA SIGUIENTE:

 
Código:
public void cargarArchivo()
        {
            try
            {
      
                if (!string.IsNullOrEmpty(this.openFileDialog1.FileName))
                {
                    ARCHIVO = this.openFileDialog1.FileName;
                    lecturaArchivo(dataGridView1, ',', ARCHIVO);

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.ToString());
            }
        }

ME SIRVE POR QUE EL "ARCHIVO" ME LLAMA MI RUTA Y ESTO 

Código:
lecturaArchivo(dataGridView1, ',', ARCHIVO);

ME ABRE MI TXT EN UN DATAGRID QUE ES ESTE TXT:

NOMBRE,APELLIDO,CEDULA,FECHA_N,CIUDAD_N
N:JOSE,A:GALLARDO,C:0705597706,FN:MACHALA,CN:29 DE OCTUBRE
N:SARA,A:CEVALLOS,C:0705597569,FN:MACHALA,CN:19 DE MAYO
N:KERLY,A:CASTRO,C:0705559719,FN:MMACHALA,CN:22/04/05
N:ELIANA,A:CAMPOVERDE,C:070597128,FN:PASAJE,CN:2/12/15
N:ELIANA,A:CALDERON,C:0705984857,FN:PASAJE,CN:22/02/15
N:KAREN,A:CORDOVA,C:070985844,FN:PAGUA,CN:22/10/1996
N:JENNIFER,A:SALINAS,C:0708954922,FN:MACHALA,CN:22 DE FEBRERO
 
Reply
#8
Te comprendo igualmente fijate no es reusable tu funcion cargarArchivo() porque tiene referencias a componentes de formulario con nombres incluso específicos:

Código:
ARCHIVO = this.openFileDialog1.FileName;
 
Reply
#9
Por favor, escribe en minúsculas. Ética de la red.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#10
Si ese txt no tiene un formato no pero si ese txt tiene formato xml ahi si puede hacerse el "binding" al archivo
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)