none
Importar archivo CSV a MDB RRS feed

  • Pregunta

  • Hola amigos:

    Necesito importar un archivo .csv hacia una tabla de una base de datos access de manera masiva.
    Habitualmente importo archivos de texto y/o archivos excel sin problemas. En el caso de los .txt de ancho fijo, utilizo schema.ini como guia de formato.

    En este caso, no puedo convertir .csv a excel por un error en un tipo de datos (códigos de barra), por lo que necesito importar el original .csv. 

    He agregado la definición del archivo a schema.ini y utilizo la misma sentencia que funciona con otros archivos de texto:

    SELECT * INTO [tablaProductos] FROM [Text;DATABASE=C:\datos\].[productos.csv]

    , y me encuentro con el siguiente mensaje de error:
    "El separador de campos de la especificación de archivo de texto coincide con el separador decimal o el delimitador de texto.El separador de campos de la especificación de archivo de texto coincide con el separador decimal o el delimitador de texto.*-2147467259"

    Modifiqué la configuración regional de modo que la coma (,) no estuviera presente ni en la separación decimal ni en la separación de miles, y el error continúa.

    Desde ya agradezco la ayuda.

    saludos afectuosos

    miércoles, 19 de diciembre de 2012 15:28

Todas las respuestas

  • Revisa en mi web el video de [importar]

    si te sirve, te paso el código

    miércoles, 19 de diciembre de 2012 16:44
  • Hola,

    Ojo con los archivos csv, porque esos archivos guardan los registos con la configuracion regional del que lo genero. Cuando ese archivo se intenta leerlo en una PC con una configuraicon regional distinta al que lo genero ahi comienzan los dolores de cabeza.

    Victor Koch.

    miércoles, 19 de diciembre de 2012 17:23
  • En mi caso el archivo a importar (proceso que debo hacer al menos una vez a la semana) tiene siempre la misma estructura, por lo que parametrizando el código no sería necesario siquiera tener una interface de importación.

    Como comenté antes, no tengo problemas con archivos .txt de ancho fijo.

    gracias por el interés
    miércoles, 19 de diciembre de 2012 19:36
  • Tengo entendido que si. En este caso el archivo .csv se genera bajo sistema operativo Unix (no conozco más detalles). El tema es que he manipulado la conf.regional de diversas maneras (siguiendo incluso sugerencia de algunos foros) sin resultado.
    El encabezado de la sección correspondiente de schema.ini es este:

    [productos.csv]
    ColNameHeader=True
    Format=CSVDelimited
    MaxScanRows=25
    CharacterSet=ANSI
    DateTimeFormat=MM-dd-yyyy
    CurrencyDigits=2
    NumberDigits=2
    Col1=Codigo          Integer Width 6
    Col2=Descripcion   Char    Width 37
    Col3=Forma         Char    Width 3
    Col4=Fracciones    Integer Width 5
    ....
    siguen varias  columnas.

    He probado también con 
    Format=Delimited(,)

    con idéntico resultado.

    desde ya muchas gracias

    miércoles, 19 de diciembre de 2012 19:40
  • Prueba a establecer en el scheme.ini los delimitadores con otro caracter que no sea la coma, supongo que usarás el punto:

    CurrencyDecimalSymbol=.
    DecimalSymbol=.

    Un saludo

    sábado, 12 de mayo de 2018 20:26
  • Gracias amigo, su consulta me sirvió de punto de partida para un requerimiento similar. A mi me resulto la siguiente Suben Vb.net por si a alguien le sirve:

        Private Sub AgregarTxtToMdb(RutaArchMDB As String, RutaArchTxt As String, TablaDestino As String)
            '  Agrega registros a MDB desde arch de texto tipo CSV con encabezado y delimitado por semicolon

            If InStr(RutaArchMDB, "\") > 0 And InStr(RutaArchTxt, "\") > 0 Then
                'Obtenemos subcadenas de Ruta y Archivo de RutaArchivos de Basedatos y Texto
                Dim nomBD As String = ""
                For i As Integer = RutaArchMDB.Length To 1 Step -1
                    If Mid(RutaArchMDB, i, 1) <> "\" Then nomBD = Mid(RutaArchMDB, i, 1) & nomBD Else Exit For
                Next
                Dim RutaMDB As String = Mid(RutaArchMDB, 1, RutaArchMDB.Length - nomBD.Length)
                Dim nomTxt As String = ""
                For i As Integer = RutaArchTxt.Length To 1 Step -1
                    If Mid(RutaArchTxt, i, 1) <> "\" Then nomTxt = Mid(RutaArchTxt, i, 1) & nomTxt Else Exit For
                Next
                Dim Ruta_Txt As String = Mid(RutaArchTxt, 1, RutaArchTxt.Length - nomTxt.Length)

                'Grabacion de Arch schema.ini para que SQL asigne encabezado desde primera fila txt y cambie delimitador a semicolon 
                Dim sw1 As New StreamWriter(Ruta_Txt & "\schema.ini", False, Encoding.Default) 'Ojo  False Sobreescribe previo
                Dim ContenidoSchema As String = "[" & nomTxt & "]" & vbCrLf & "ColNameHeader=True " & vbCrLf & "Format=Delimited(;)"
                sw1.Write(ContenidoSchema) : sw1.Flush() : sw1.Close()

                Try
                    Dim con As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source =" & RutaArchMDB)
                    con.Open()
                    'Agregar Datos a Tabla temporal tmp
                    Dim AddTxt As OleDbCommand
                    Dim Sql As String = "SELECT * INTO temp FROM [Text;DATABASE=" & Ruta_Txt & "\]." & nomTxt & ";"
                    AddTxt = New OleDbCommand(Sql, con)
                    AddTxt.ExecuteNonQuery()
                    'Anexar desde tabla temp a TablaDestino
                    Dim AddToData As OleDbCommand
                    Sql = "INSERT INTO " & TablaDestino & " SELECT temp.* FROM temp;"
                    AddToData = New OleDbCommand(Sql, con)
                    AddToData.ExecuteNonQuery()
                    'Borrar Temp de Basedatos y archivo temporal schema.ini de carpeta de archivo de texto
                    Dim BorrarTemp As OleDbCommand
                    Sql = "DROP TABLE temp;"
                    BorrarTemp = New OleDbCommand(Sql, con)
                    BorrarTemp.ExecuteNonQuery()
                    con.Close()
                    If File.Exists(Ruta_Txt & "\schema.ini") Then Kill(Ruta_Txt & "\schema.ini") 'elimina schema.ini
                    MessageBox.Show("Data de archivo de texto " & nomTxt & " fue agregado a MDB")
                Catch ex As Exception
                    MessageBox.Show("Data de archivo de texto " & nomTxt & " no pudo ser agregado a MDB" & vbCrLf & ex.Message)
                End Try
            Else
                MessageBox.Show("Error: Parametros RutaArch deben incluir Nombre completo, incluida la Ruta, en subrutina AgregarTxtToMdb")
            End If
        End Sub


    domingo, 26 de enero de 2020 19:50