none
SPlit de csv con ; RRS feed

  • Pregunta

  • Hola

    Hola tengo un server externo q no tiene Excel (y por lo tanto tpco 'Microsoft.Jet.OLEDB.4.0' instalado)

    Necesito importar un csv con este contenido:

    a;b;c

    "c;2";f,f2;g

    No puedo hacer un split por ; pq. me partiría la segunda línea 1er campo

    No puedo hacer un split por , pq. me partiría la segunda línea 2a campo

    Alguna idea?


    GRacias

    jueves, 25 de abril de 2013 13:02

Respuestas

  • Está impecable. Para eso son las comillas. Un driver csv lo entiende perfectamente. Obviamente la función split tiene un propósito más modesto.
    jueves, 25 de abril de 2013 13:48
  • "chascos69" escribió:

    > tengo un server externo q no tiene Excel (y por lo tanto
    > tpco 'Microsoft.Jet.OLEDB.4.0' instalado)

    Hola:

    Vale que no tenga Excel, no así que no disponga del motor de datos Microsoft Jet. ¿Qué versión de Windows estás utilizando? ¿Windows 95, 98, Millenium?

    Que yo sepa, el motor de datos Microsoft Jet viene instalado por defecto desde Microsoft Windows XP, y si no está instalado, sería cuestión de instalarlo. :-D

    > Necesito importar un csv con este contenido:
    >
    > a;b;c
    >
    > "c;2";f,f2;g
    >
    > No puedo hacer un split por ; pq. me partiría la segunda línea 1er campo
    >
    > No puedo hacer un split por , pq. me partiría la segunda línea 2a campo
    >
    > Alguna idea?

    Se puede hacer "magia" siempre y cuando los valores de los campos o columnas estén ENCERRADOS ENTRE COMILLAS DOBLES:

        "a","b","c"
        "c;2","f,f2","g"

    Se comprende que "a","b","c" son los nombres de las columnas del archivo de texto delimitado.

    De ésta manera podrías hacer uso del ISAM de texto del motor de datos Microsoft Jet (no de Microsoft Excel), para leer un archivo de texto delimitado por comas (csv), tal y como así muestra el siguiente ejemplo, el cual asume que existe un archivo llamado archivo.csv con los datos anteriormente indicados, en la carpeta C:\Mis documentos:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim cadenaConexion As String = _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\Mis documentos;" & _
                "Extended Properties='TEXT;'"
    
            Try
                Using cnn As New OleDbConnection(cadenaConexion)
    
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
                    cmd.CommandText = "SELECT * FROM [Archivo#csv]"
    
                    Dim da As New OleDbDataAdapter(cmd)
                    Dim dt As New DataTable()
                    da.Fill(dt)
    
                    DataGridView1.DataSource = dt
                    
                End Using
                
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Como podrás observar, los datos "sensibles" deben de estar delimitados por comillas dobles, porque si no es así, sería IMPOSIBLE delimitarlos, y esto es válido tanto para el ISAM de texto del motor de datos Microsoft Jet como para cualquier otro motor de datos diferente que nos permita importar datos de texto delimitados, como bien puede ser Microsoft SQL Server.

    Por supuesto, para esta simple operación de lectura de datos no te hace falta para nada Microsoft Excel.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    jueves, 25 de abril de 2013 14:44
    Moderador

Todas las respuestas

  • y por lo tanto tpco 'Microsoft.Jet.OLEDB.4.0' instalado

    no veo que relacion tiene Jet con excel si este es un proveedor de ado.net, este se instala por medio de MDAC

    esto de aqui

    "c;2"

    es incorrecto, si usas el punto y coma como separador es logico que no debes usarlo para otra cosa, deberias reemplazar por : o alli usar una coma

     sino normalizas el archivo que generas magia no se puede ahcer para procesarlo

    ----

    porque no evaluas usar

    http://filehelpers.sourceforge.net/

    con esta libreria podrias procesar un archivo delimitado por un caracter

    slaudos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    jueves, 25 de abril de 2013 13:10
  • Está impecable. Para eso son las comillas. Un driver csv lo entiende perfectamente. Obviamente la función split tiene un propósito más modesto.
    jueves, 25 de abril de 2013 13:48
  • "chascos69" escribió:

    > tengo un server externo q no tiene Excel (y por lo tanto
    > tpco 'Microsoft.Jet.OLEDB.4.0' instalado)

    Hola:

    Vale que no tenga Excel, no así que no disponga del motor de datos Microsoft Jet. ¿Qué versión de Windows estás utilizando? ¿Windows 95, 98, Millenium?

    Que yo sepa, el motor de datos Microsoft Jet viene instalado por defecto desde Microsoft Windows XP, y si no está instalado, sería cuestión de instalarlo. :-D

    > Necesito importar un csv con este contenido:
    >
    > a;b;c
    >
    > "c;2";f,f2;g
    >
    > No puedo hacer un split por ; pq. me partiría la segunda línea 1er campo
    >
    > No puedo hacer un split por , pq. me partiría la segunda línea 2a campo
    >
    > Alguna idea?

    Se puede hacer "magia" siempre y cuando los valores de los campos o columnas estén ENCERRADOS ENTRE COMILLAS DOBLES:

        "a","b","c"
        "c;2","f,f2","g"

    Se comprende que "a","b","c" son los nombres de las columnas del archivo de texto delimitado.

    De ésta manera podrías hacer uso del ISAM de texto del motor de datos Microsoft Jet (no de Microsoft Excel), para leer un archivo de texto delimitado por comas (csv), tal y como así muestra el siguiente ejemplo, el cual asume que existe un archivo llamado archivo.csv con los datos anteriormente indicados, en la carpeta C:\Mis documentos:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim cadenaConexion As String = _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\Mis documentos;" & _
                "Extended Properties='TEXT;'"
    
            Try
                Using cnn As New OleDbConnection(cadenaConexion)
    
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
                    cmd.CommandText = "SELECT * FROM [Archivo#csv]"
    
                    Dim da As New OleDbDataAdapter(cmd)
                    Dim dt As New DataTable()
                    da.Fill(dt)
    
                    DataGridView1.DataSource = dt
                    
                End Using
                
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Como podrás observar, los datos "sensibles" deben de estar delimitados por comillas dobles, porque si no es así, sería IMPOSIBLE delimitarlos, y esto es válido tanto para el ISAM de texto del motor de datos Microsoft Jet como para cualquier otro motor de datos diferente que nos permita importar datos de texto delimitados, como bien puede ser Microsoft SQL Server.

    Por supuesto, para esta simple operación de lectura de datos no te hace falta para nada Microsoft Excel.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    jueves, 25 de abril de 2013 14:44
    Moderador
  • _borrado_

    mi primer parte de la respuesta apuntaba al uso del split, no estaba evaluando la valides de un csv, como tipo de archivo

    si la idea era procesar esto como cadena es logico que se deberia normalizar para poder proceder

    pero la primer linea aclaro que jet se puede usar a pesar que no este instalado office


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 25 de abril de 2013 15:05
  • Vaya pensaba q Jet se instalaba con Office y no con Windows. Puede darse el caso q no esté instalado? Windows server 2003? WIn 7? Win 8?



    GRacias



    • Editado chascos69 jueves, 25 de abril de 2013 18:28
    jueves, 25 de abril de 2013 18:18
  • hola

    seria algo raro

    pero me pregunto, que error obtienes cuando usas jet para procesar el archivo?, lo pregunto porque puede que el problema sea porque usas una pc de 64 bits

    en ese caso solo cambia el Platform Target del proyecto a x86, asi sera compatible con 32bits

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 25 de abril de 2013 19:34