none
Como leer archivos planos (txt) RRS feed

  • Pregunta

  • Necesito leer un archivo plano txt en c# y luego insertar esa informacion en una tabla , la instruccion dice que debo usar en la pantalla un openfiledialog no se como utilizarlo, el archivo que se lee viene con un estandar que es el siguiente:


     Codigodelaentidad_codigodelservicio_nombrearchivo_fechaarchivo.txt

    Gracias por la ayuda
    jueves, 8 de abril de 2010 21:10

Respuestas

  • hola

    el uso de no del OpenFileDialog por si quieres dar la posibildiad a quien use la aplciacion de seleccionar un archivo concreto a procesar

    si tu ya tienes definido la ruta dodne esta el archivo no necesitas usar el OpenFileDialog

    para leer el archivo ayuda de esta clase StreamReader

    alli mismo hay un ejemplo de como leer el contenidod el texto de forma secuencial

    luego queda lo de la db, pero bueno deberias indicar que db vas a usar es Sql Server, Access, MySql, etc

    vas a usar los objetos de ado.net simpes o usaras dataset tipados

    te dejo un link de ejemplo

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    deberias recorrer cada liena del archivo, cortar cada parte con info y armar la consulta de INSERT o UPDATE para actualziar la tabla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta don2690 domingo, 11 de abril de 2010 16:20
    jueves, 8 de abril de 2010 21:16
  • Hola:

    Si hablamos de un archivo de texto delimitado, la solución la tienes en el siguiente enlace, del cual sólo te tienes que quedar con la teoría:

    Cómo pasar datos entre diferentes orígenes de datos

    A lo mejor te estás preguntando que no conoces ese lenguaje tan raro que utilizo en los ejemplos del artículo. Se trata del lenguaje Visual Basic .NET, pero no te preocupes, que aquí te dejo la traducción a código de C# de los distintos métodos.

    Para obtener el objeto DataTable con los datos del archivo de texto:

            private DataTable GetDataTable()
            {
                using (OleDbConnection cnn = new OleDbConnection())
                {
                    try
                    {
                        // Definimos la cadena de conexión OleDb,
                        // indicando nuestra intención de conectarnos
                        // con un archivo de texto delimitado donde
                        // la primera fila no contiene los nombres
                        // de los campos.
                        //
                        cnn.ConnectionString =
                            "Provider=Microsoft.Jet.OLEDB.4.0;" +
                            "Data Source=D:\\Bases\\Texto;" +
                            "Extended Properties='TEXT;HDR=No;'";

                        // Construimos la consulta SQL de selección.
                        //
                        string sql = "SELECT * FROM Archivo#csv";

                        // Creamos el adaptador de datos.
                        //
                        OleDbDataAdapter da = new OleDbDataAdapter(sql, cnn);

                        // Mapeamos la tabla para que los nombres de los campos
                        // sean iguales a los existentes en la tabla de SQL Server.
                        //
                        System.Data.Common.DataTableMapping dtm =
                                new System.Data.Common.DataTableMapping("Archivo", "SociosMapping");
                       
                        dtm.ColumnMappings.Add("F1", "IdSocio");
                        dtm.ColumnMappings.Add("F2", "Nombre");
                        dtm.ColumnMappings.Add("F3", "FechaNto");

                        da.TableMappings.Add(dtm);

                        // Construimos el objeto DataTable, utilizando el nombre
                        // de la tabla mapeada.
                        //
                        DataTable dt = new DataTable("SociosMapping");

                        // Rellenamos el objeto DataTable.
                        //
                        da.Fill(dt);

                        // Devolvemos el objeto DataTable.
                        //

                        return dt;
                    }
                    catch (Exception)
                    {
                        // Devolvemos la excepción al procedimiento llamador.
                        //
                        throw;
                    }

                }
            }

    Para actualizar la tabla de SQL Server:

            private int UpdateData(DataTable dt)
            {
                // Si el objeto DataTable no es válido, o no contiene
                // registros, abandonamos el procedimiento.
                //
                if ((dt == null) || (dt.Rows.Count == 0)) return 0;

                // Establecemos la conexión con la base de SQL Server.
                //
                using (SqlConnection cnn = new SqlConnection())
                {
                    try
                    {
                        // Construimos la cadena de conexión con la instancia
                        // local de SQL Server, utilizando la seguridad
                        // integrada de Windows NT.
                        //
                        cnn.ConnectionString = "Data Source=(local);" + "Initial Catalog=Prueba;" + "Integrated Security=SSPI";

                        // Construimos la consulta T-SQL de selección, especificando
                        // expresamente las columnas que vamos a rellenar de datos.
                        //
                        string sql = "SELECT IdSocio, Nombre, FechaNto FROM Socios";

                        // Creamos el adaptador de datos.
                        //
                        SqlDataAdapter da = new SqlDataAdapter(sql, cnn);

                        // Instalamos el controlador para el evento RowUpdated.
                        //
                        da.RowUpdated += AdapterOnRowUpdated;

                        // Creamos un objeto SqlCommandBuilder.
                        //
                        SqlCommandBuilder cb = new SqlCommandBuilder(da);

                        // Configuramos únicamente el comando de inserción del
                        // adaptador de datos.
                        //
                        da.InsertCommand = cb.GetInsertCommand();

                        // Para que se pueda actualizar los datos, el valor de la propiedad RowState
                        // de los objetos DataRow tiene que ser distinta a Unchanged, por lo que de
                        // ser así, la pasaremos a Added.
                        //
                        foreach (DataRow row in dt.Rows)
                        {
                            if (row.RowState == DataRowState.Unchanged)
                            {
                                row.SetAdded();
                            }
                        }

                        // Actualizamos la tabla.
                        //
                        int n = da.Update(dt);

                        // Aceptamos los cambios.
                        //
                        dt.AcceptChanges();

                        // Devolvemos el número de registros afectados.
                        //

                        return n;
                    }
                    catch (Exception)
                    {
                        // Devolvemos la excepción al procedimiento llamador.
                        //
                        throw;
                    }

                }
            }

    El evento RowUpdated del objeto SqlDataAdapter:

            private void AdapterOnRowUpdated(
                object sender, System.Data.SqlClient.SqlRowUpdatedEventArgs e)
            {
                if(e.Status == UpdateStatus.ErrorsOccurred)
                {
                    // Si se ha producido un error, intentamos
                    // continuar con la inserción de registros.
                    //
                    e.Status = UpdateStatus.Continue;

                    if (m_rows == null)
                    {
                        Array.Resize(ref m_rows, 1);

                    }
                    else
                    {
                        Array.Resize(ref m_rows, m_rows.Length + 1);

                    }

                    e.CopyToRows(m_rows, m_rows.Length - 1);
               
                }
            }

        }

    Para ejecutar todo el proceso:

                    private DataRow[] m_rows;

                    try
                    {
                        // Obtenemos el objeto DataTable.
                        //
                        DataTable dt = GetDataTable();

                        // Establecemos a null el array de objetos DataRow
                        //
                        m_rows = null;

                        // Procedemos a actualizar la base de SQL Server.
                        //
                        int n = UpdateData(dt);

                        MessageBox.Show("Número de registros afectados: " + n.ToString());
                    }
                    catch (Exception ex)
                    {

                        MessageBox.Show(ex.Message);
                    }

    Al comienzo de la clase, escribe las siguientes instrucciones para importar los correspondientes espacios de nombres:

    using System.Data.OleDb;
    using System.Data.SqlClient;

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. Montejo domingo, 11 de abril de 2010 16:05
    • Marcado como respuesta don2690 domingo, 11 de abril de 2010 16:20
    domingo, 11 de abril de 2010 16:05

Todas las respuestas

  • hola

    el uso de no del OpenFileDialog por si quieres dar la posibildiad a quien use la aplciacion de seleccionar un archivo concreto a procesar

    si tu ya tienes definido la ruta dodne esta el archivo no necesitas usar el OpenFileDialog

    para leer el archivo ayuda de esta clase StreamReader

    alli mismo hay un ejemplo de como leer el contenidod el texto de forma secuencial

    luego queda lo de la db, pero bueno deberias indicar que db vas a usar es Sql Server, Access, MySql, etc

    vas a usar los objetos de ado.net simpes o usaras dataset tipados

    te dejo un link de ejemplo

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    deberias recorrer cada liena del archivo, cortar cada parte con info y armar la consulta de INSERT o UPDATE para actualziar la tabla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta don2690 domingo, 11 de abril de 2010 16:20
    jueves, 8 de abril de 2010 21:16
  • Hola:

    Si hablamos de un archivo de texto delimitado, la solución la tienes en el siguiente enlace, del cual sólo te tienes que quedar con la teoría:

    Cómo pasar datos entre diferentes orígenes de datos

    A lo mejor te estás preguntando que no conoces ese lenguaje tan raro que utilizo en los ejemplos del artículo. Se trata del lenguaje Visual Basic .NET, pero no te preocupes, que aquí te dejo la traducción a código de C# de los distintos métodos.

    Para obtener el objeto DataTable con los datos del archivo de texto:

            private DataTable GetDataTable()
            {
                using (OleDbConnection cnn = new OleDbConnection())
                {
                    try
                    {
                        // Definimos la cadena de conexión OleDb,
                        // indicando nuestra intención de conectarnos
                        // con un archivo de texto delimitado donde
                        // la primera fila no contiene los nombres
                        // de los campos.
                        //
                        cnn.ConnectionString =
                            "Provider=Microsoft.Jet.OLEDB.4.0;" +
                            "Data Source=D:\\Bases\\Texto;" +
                            "Extended Properties='TEXT;HDR=No;'";

                        // Construimos la consulta SQL de selección.
                        //
                        string sql = "SELECT * FROM Archivo#csv";

                        // Creamos el adaptador de datos.
                        //
                        OleDbDataAdapter da = new OleDbDataAdapter(sql, cnn);

                        // Mapeamos la tabla para que los nombres de los campos
                        // sean iguales a los existentes en la tabla de SQL Server.
                        //
                        System.Data.Common.DataTableMapping dtm =
                                new System.Data.Common.DataTableMapping("Archivo", "SociosMapping");
                       
                        dtm.ColumnMappings.Add("F1", "IdSocio");
                        dtm.ColumnMappings.Add("F2", "Nombre");
                        dtm.ColumnMappings.Add("F3", "FechaNto");

                        da.TableMappings.Add(dtm);

                        // Construimos el objeto DataTable, utilizando el nombre
                        // de la tabla mapeada.
                        //
                        DataTable dt = new DataTable("SociosMapping");

                        // Rellenamos el objeto DataTable.
                        //
                        da.Fill(dt);

                        // Devolvemos el objeto DataTable.
                        //

                        return dt;
                    }
                    catch (Exception)
                    {
                        // Devolvemos la excepción al procedimiento llamador.
                        //
                        throw;
                    }

                }
            }

    Para actualizar la tabla de SQL Server:

            private int UpdateData(DataTable dt)
            {
                // Si el objeto DataTable no es válido, o no contiene
                // registros, abandonamos el procedimiento.
                //
                if ((dt == null) || (dt.Rows.Count == 0)) return 0;

                // Establecemos la conexión con la base de SQL Server.
                //
                using (SqlConnection cnn = new SqlConnection())
                {
                    try
                    {
                        // Construimos la cadena de conexión con la instancia
                        // local de SQL Server, utilizando la seguridad
                        // integrada de Windows NT.
                        //
                        cnn.ConnectionString = "Data Source=(local);" + "Initial Catalog=Prueba;" + "Integrated Security=SSPI";

                        // Construimos la consulta T-SQL de selección, especificando
                        // expresamente las columnas que vamos a rellenar de datos.
                        //
                        string sql = "SELECT IdSocio, Nombre, FechaNto FROM Socios";

                        // Creamos el adaptador de datos.
                        //
                        SqlDataAdapter da = new SqlDataAdapter(sql, cnn);

                        // Instalamos el controlador para el evento RowUpdated.
                        //
                        da.RowUpdated += AdapterOnRowUpdated;

                        // Creamos un objeto SqlCommandBuilder.
                        //
                        SqlCommandBuilder cb = new SqlCommandBuilder(da);

                        // Configuramos únicamente el comando de inserción del
                        // adaptador de datos.
                        //
                        da.InsertCommand = cb.GetInsertCommand();

                        // Para que se pueda actualizar los datos, el valor de la propiedad RowState
                        // de los objetos DataRow tiene que ser distinta a Unchanged, por lo que de
                        // ser así, la pasaremos a Added.
                        //
                        foreach (DataRow row in dt.Rows)
                        {
                            if (row.RowState == DataRowState.Unchanged)
                            {
                                row.SetAdded();
                            }
                        }

                        // Actualizamos la tabla.
                        //
                        int n = da.Update(dt);

                        // Aceptamos los cambios.
                        //
                        dt.AcceptChanges();

                        // Devolvemos el número de registros afectados.
                        //

                        return n;
                    }
                    catch (Exception)
                    {
                        // Devolvemos la excepción al procedimiento llamador.
                        //
                        throw;
                    }

                }
            }

    El evento RowUpdated del objeto SqlDataAdapter:

            private void AdapterOnRowUpdated(
                object sender, System.Data.SqlClient.SqlRowUpdatedEventArgs e)
            {
                if(e.Status == UpdateStatus.ErrorsOccurred)
                {
                    // Si se ha producido un error, intentamos
                    // continuar con la inserción de registros.
                    //
                    e.Status = UpdateStatus.Continue;

                    if (m_rows == null)
                    {
                        Array.Resize(ref m_rows, 1);

                    }
                    else
                    {
                        Array.Resize(ref m_rows, m_rows.Length + 1);

                    }

                    e.CopyToRows(m_rows, m_rows.Length - 1);
               
                }
            }

        }

    Para ejecutar todo el proceso:

                    private DataRow[] m_rows;

                    try
                    {
                        // Obtenemos el objeto DataTable.
                        //
                        DataTable dt = GetDataTable();

                        // Establecemos a null el array de objetos DataRow
                        //
                        m_rows = null;

                        // Procedemos a actualizar la base de SQL Server.
                        //
                        int n = UpdateData(dt);

                        MessageBox.Show("Número de registros afectados: " + n.ToString());
                    }
                    catch (Exception ex)
                    {

                        MessageBox.Show(ex.Message);
                    }

    Al comienzo de la clase, escribe las siguientes instrucciones para importar los correspondientes espacios de nombres:

    using System.Data.OleDb;
    using System.Data.SqlClient;

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. Montejo domingo, 11 de abril de 2010 16:05
    • Marcado como respuesta don2690 domingo, 11 de abril de 2010 16:20
    domingo, 11 de abril de 2010 16:05
  • Gracias me ayudo mucho tu ejemplo
    domingo, 11 de abril de 2010 16:20
  • Gracias utilice tu ejemplo y me sirvio en algunas partes gracias
    domingo, 11 de abril de 2010 16:21