Usuario
Importar archivo CSV a MDB

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
Todas las respuestas
-
Revisa en mi web el video de [importar]
si te sirve, te paso el código
-
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.
-
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 -
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
-
-
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