Manejar archivos CSV y cargarlos a un GridView en ASP.NET

En este post se mostró como manipular los datos desde un archivo csv y guardarlo en tablas en SQL Server 2005:

http://geeks.ms/blogs/mredison/archive/2009/04/08/tip-manejo-de-archivos-csv-con-sql-server.aspx

Pero este post simplemente se basa en cargar un archivo a un directorio dentro del proyecto web, leer dicho archivo y mostrar los datos en una regilla de datos (GridView) sin hacer uso del servidor de base de datos.

El formulario que se ocupará tendrá estos controles web:

  • Un control FileUpload.
  • Dos botones de comando.
  • Dos labels
  • Un gridView

CsvFilesUpload_01

HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <div>
    
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Subir" />
    
        <asp:Button ID="Button2" runat="server" Text="Cargar Datos-Tabla" 
            onclick="Button2_Click" />
    
    </div>
    <asp:Label ID="lblOculto" runat="server" Text="" Visible="false"></asp:Label>
    <br />
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    <asp:GridView ID="GridView1" runat="server" Height="251px" Width="420px">
    </asp:GridView>
    </form>
</body>
</html>

 

Código:

En Default.aspx.cs crearemos estos métodos.

 private DataTable CrearTabla(String fila)
    {
        int cantidadColumnas;
        DataTable tabla = new DataTable("Datos");
        String[] valores = fila.Split(new char[] { ',' });
        cantidadColumnas = valores.Length;
        int idx = 0;
        foreach (String val in valores)
        {
            String nombreColumna = String.Format("{0}", idx++);
            tabla.Columns.Add(nombreColumna, Type.GetType("System.String"));
        }
        return tabla;
    }

 

En este primer método se creará la tabla de acuerdo a la cantidad de columnas que se obtengan y que se hayan guardado en un arreglo de tipo string.

Posteriormente crearemos el método AgregarFila:

private DataRow AgregarFila(String fila, DataTable tabla)
    {
        int cantidadColumnas = 100;
        String[] valores = fila.Split(new char[] { ',' });
        Int32 numeroTotalValores = valores.Length;
        if (numeroTotalValores > cantidadColumnas)
        {
            Int32 diferencia = numeroTotalValores - cantidadColumnas;
            for (Int32 i = 0; i < diferencia; i++)
            {

                String nombreColumna = String.Format("{0}", (cantidadColumnas + i));
                tabla.Columns.Add(nombreColumna, Type.GetType("System.String"));
            }
            cantidadColumnas = numeroTotalValores;
        }
        int idx = 0;
        DataRow dfila = tabla.NewRow();
        foreach (String val in valores)
        {
            String nombreColumna = String.Format("{0}", idx++);
            dfila[nombreColumna] = val.Trim();
        }
        tabla.Rows.Add(dfila);
        return dfila;
    }

Método CargarDatos:

Teniendo listos los primeros dos métodos de crearTabla y agregarFilas a la tabla, procedemos a cargar los datos mediante una ruta como parametro:

 private void CargarDatos(string strm)
    {
        DataTable tabla = null;
        StreamReader lector = new StreamReader(strm);
        String fila = String.Empty;
        Int32 cantidad = 0;
        do
        {
            fila = lector.ReadLine();
            if (fila == null)
            {
                break;
            }
            if (0 == cantidad++)
            {
                tabla = this.CrearTabla(fila);
            }
            this.AgregarFila(fila, tabla);
        } while (true);

        GridView1.DataSource = tabla;
        GridView1.DataBind();
    }

Este método checa si existen datos en el archivo,  crea la tabla y agrega las filas a dicha tabla, además de mostrarlos en el GridView.

Carga de Archivos con FileUpload:

Haremos un método de tipo bool, que determinará que tipo de archivo solo quiero que suba el usuario.

 bool ChecarExtension(string fileName)
    {
        string ext = Path.GetExtension(fileName);
        switch (ext.ToLower())
        {
            case ".csv":
                return true;
            default:
                return false;
        }
    }

Posteriormente en el botón de Subir, agregaremos el siguiente código:

public void Button1_Click(object sender, EventArgs e)
    {
        
        
        if (FileUpload1.HasFile)
        {
            if (ChecarExtension(FileUpload1.FileName))
            {
                FileUpload1.SaveAs( MapPath("Archivos/" + FileUpload1.FileName));
                

                 Label1.Text =FileUpload1.FileName +" cargado exitosamente";

                 lblOculto.Text = MapPath("Archivos/" + FileUpload1.FileName);
            }
        }
        else
        {
            Label1.Text = "Error al subir el archivo o no es el tipo .CSV"; 
        }

    }

 

En esta parte indicamos en que directorio se colocará dicho archivo y obtenemos la ruta que posteriormente pasaremos como parametro al método CargarDatos(); a continuación:

 

CsvFilesUpload_02

protected void Button2_Click(object sender, EventArgs e)
    {
        try
        {

            CargarDatos(lblOculto.Text);
        }
        catch
        {
            Response.Write("Ocurrió un error debe cargar antes el archivo");
        }
    }

CsvFilesUpload_03

 

Descarga el archivo de código: CSV.zip-download

Entrenamiento de apoyo para el examen de certificación 70-536 TS: Microsoft .NET Framework Application Development Foundation

MVP Miguel Muñoz, director de la comunidad de desarrolladores de Puebla en México, nos comparte un entrenamiento completo de apoyo para el 70-536. Aprovéchenlo. Saludos.

Para desarrolladores avanzados
Introducción al desarrollo de aplicaciones Microsoft .NET utilizando Visual Studio 2008 (Para principiantes.)

Tip: Manejo de Archivos CSV con SQL Server

Wikipedia:

Los ficheros CSV (del inglés comma-separated values) son un tipo de documento sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas (o punto y coma en donde la coma es el separador decimal: España, Francia, Italia…) y las filas por saltos de línea. Los campos que contengan una coma, un salto de línea o una comilla doble deben ser encerrados entre comillas dobles.

El formato CSV es muy sencillo y no indica un juego de caracteres concreto, ni cómo van situados los bytes, ni el formato para el salto de línea. Estos puntos deben indicarse muchas veces al abrir el fichero, por ejemplo, con una hoja de cálculo.

Fuente: http://es.wikipedia.org/wiki/CSV

¿Cómo sacar provecho de este tipo de archivos en SQL Server?

CREATE DATABASE ESCUELA
USE  ESCUELA

CREATE TABLE ALUMNOS(
    NOCONTROL INT NOT NULL,
    NOMBRE VARCHAR(50) NOT NULL,
    SEMESTRE INT
)
ALTER TABLE ALUMNOS ADD CONSTRAINT PK_ALUMNOS PRIMARY KEY(NOCONTROL)

Tenemos este ejemplo muy sencillo de una tabla Alumnos.
 
Ahora vamos a utilizar un archivo CSV, pueden crearlo desde notepad o Microsoft Excel y guardarlo como .csv, en este caso puede utilizar comas para separar entre campos.
 
ARCHIVOSCVS
BULK INSERT ALUMNOS 
    FROM 'c:Alumnos.csv' 
    WITH 
    ( 
        FIRSTROW = 1, 
        MAXERRORS = 0, 
        FIELDTERMINATOR = ',', 
        ROWTERMINATOR = 'n' 
    )
    

Ahora ocuparemos una sentencia T-SQL llamada BULK INSERT con este comando puedes importar algun documento a sql server desde un txt, xml, etc. y agregar registros a la tabla correspondiente.
 
Damos un select a la tabla alumnos.
 
ARCHIVOSCVS2

Muy práctico para agregar registros a una tabla desde script.

Saludos.

Edison Daniel García Chiñas  | Microsoft Student Partner

Microsoft Data Access Application Block

Son pequeñas clases que nos ayudan mucho a los desarrolladores, en este caso para manipular los datos desde código, existe un archivo llamado SQLHelper que contiene métodos reutilizables para llamar procedimientos almacenados y comandos SQL en forma de texto.

Les recomiendo que lo descarguen y lo utilizen para sus proyectos.

URL: http://www.microsoft.com/downloads/details.aspx?FamilyID=f63d1f0a-9877-4a7b-88ec-0426b48df275&displaylang=en