none
leer archivo csv pero filtrado por fechas RRS feed

  • Pregunta

  • Hola a todos estoy haciendo un desarrollo en C#, donde leo un archivo csv que debo filtrarlo por el campo fecha porque este archivo tiene registros de muchos meses.  El campo fecha tiene un dato como este (5/30/2008), y no se como hacerlo.  Si alguien pudiera colaborarme se lo agradecería.  De hecho si le digo que lo lea sin filtrar lo carga perfectamente.

     

    Sin embargo no quiero recorrerlo porque en algun momento puede tener mas de 1 millon de registros, la idea es cargar solo lo que necesito.

    miércoles, 10 de septiembre de 2008 20:23

Respuestas

  • :-)

    Hola,

     

    Pues hasta que no aparezca oficialmente un proveedor de LINQ to CSV (de momento existe esta aproximación: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx) es casi imposible. Y ya veremos el rendimiento que va a tener...

     

    De todos modos estos procesos tienen mal arreglo. Yo personalmente te aconsejaría volcar este fichero CSV en una tabla de SQL Server periódicamente (cada noche por ejemplo). Tienes varias alternativas: Un paquete de Integration Services, BCP, creando una aplicación que lo haga a mano, etc.)

     

    De este modo puedes interrogar a la Bd como siempre: SELECT ... FROM ... WHERE

     

    Saludos,
    jueves, 11 de septiembre de 2008 8:38
    Moderador
  • Hola agradezco tu colaboración sin embargo lo solucioné usando el proveedor oledb.

     

    string connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" + "Extended Properties='text;HDR={1};FMT={2}'", archivo.DirectoryName, conEncabezado, tipoDeArchivo.ToString());

    DataTable dt = new DataTable("miTabla");

    DateTime fechaFinal = Convert.ToDateTime(fechaInicial.AddHours(intervalo));

    fechaFinal = fechaFinal.AddSeconds(1);

    String cadena = "SELECT F1 AS fecha, F2 as hora, (F1 + F2) as fechacomp, F3 as apellidos, F4 as nombres, F5,f6 AS SOEID,F7 AS NODO, F8 AS ESTACION,F9,F10 AS IP FROM " + archivo.Name;

    cadena += " where (F1 + F2)>=#" + fechaInicial + "# and (F1 + F2)<#" + fechaFinal + "#";

    using (OleDbConnection conn = new OleDbConnection(connectionString))

    using (OleDbDataAdapter da = new OleDbDataAdapter(cadena, conn))

    {

    da.Fill(dt);

    }

    return dt;

     

    Realmente es interesante porque lee sólo la porción que necesito sin necesidad de cargar todo el archivo a memoria o leerlo registro a registro.

     

    Saludos

    jueves, 11 de septiembre de 2008 17:39

Todas las respuestas

  • :-)

    Hola,

     

    Pues hasta que no aparezca oficialmente un proveedor de LINQ to CSV (de momento existe esta aproximación: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx) es casi imposible. Y ya veremos el rendimiento que va a tener...

     

    De todos modos estos procesos tienen mal arreglo. Yo personalmente te aconsejaría volcar este fichero CSV en una tabla de SQL Server periódicamente (cada noche por ejemplo). Tienes varias alternativas: Un paquete de Integration Services, BCP, creando una aplicación que lo haga a mano, etc.)

     

    De este modo puedes interrogar a la Bd como siempre: SELECT ... FROM ... WHERE

     

    Saludos,
    jueves, 11 de septiembre de 2008 8:38
    Moderador
  • Hola agradezco tu colaboración sin embargo lo solucioné usando el proveedor oledb.

     

    string connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" + "Extended Properties='text;HDR={1};FMT={2}'", archivo.DirectoryName, conEncabezado, tipoDeArchivo.ToString());

    DataTable dt = new DataTable("miTabla");

    DateTime fechaFinal = Convert.ToDateTime(fechaInicial.AddHours(intervalo));

    fechaFinal = fechaFinal.AddSeconds(1);

    String cadena = "SELECT F1 AS fecha, F2 as hora, (F1 + F2) as fechacomp, F3 as apellidos, F4 as nombres, F5,f6 AS SOEID,F7 AS NODO, F8 AS ESTACION,F9,F10 AS IP FROM " + archivo.Name;

    cadena += " where (F1 + F2)>=#" + fechaInicial + "# and (F1 + F2)<#" + fechaFinal + "#";

    using (OleDbConnection conn = new OleDbConnection(connectionString))

    using (OleDbDataAdapter da = new OleDbDataAdapter(cadena, conn))

    {

    da.Fill(dt);

    }

    return dt;

     

    Realmente es interesante porque lee sólo la porción que necesito sin necesidad de cargar todo el archivo a memoria o leerlo registro a registro.

     

    Saludos

    jueves, 11 de septiembre de 2008 17:39
  • Mira lo que yo haria seria cargar el csv en una datatable y lueg hacerle el select al datatable
    jueves, 11 de septiembre de 2008 17:55