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
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:
protected void Button2_Click(object sender, EventArgs e) { try { CargarDatos(lblOculto.Text); } catch { Response.Write("Ocurrió un error debe cargar antes el archivo"); } }
Descarga el archivo de código: CSV.zip-download