** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Importar csv y transponer
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Importar csv y transponer

 Responder Responder
Autor
Mensaje
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Importar csv y transponer
    Enviado: 21/Marzo/2024 a las 04:17
Hola a todos una vez mas,

Estoy trabajando en una importacion de un archivo csv el formato es una especie de Cross Table lo que pretendo es importar ese archivo de forma tabular a mi tabla access les muestro una imagen.



Los datos a importar siempre comienzan desde el row 4 (variable la cantidad de rows) y desde la columna A a la G.

Desde la columna H hacia adelante la cantidad de columnas es variable puede ser solo la columna H la que tenga datos y he visto hasta 200 columnas es decir columna H a GY pero como comento es variable.

Entonces la columna H quiero transponerlo a la columna C1 de mi tabla solo los rows que tengan como valor en esa columna 1 con su respectivos datos de ese row.
Columna C2 de mi tabla los valores de 1 de columna H.

Columna C3 el valor correspondiente para esa row,columna y asi consecutivamente con el resto de los datos.

Para ello he estado trabajando en este trozo de codigo, pero me salta error Runt time error 9  Subscript out of range en la linea comentada en el siguiente codigo:

Sub Import()
Dim rst As New ADODB.Recordset
Dim tbl() As Variant
Dim fld As Integer
Dim flds() As Variant

    rst.CursorLocation = adUseClient
    rst.Open "SELECT Top 10 * FROM [Text;Database=C:\dataimport\].quote.csv;", CurrentProject.Connection, adOpenStatic, adLockReadOnly

    ReDim flds(rst.Fields.Count - 1 - 7) '<-- Aqui ,marca el error
    For fld = 0 To UBound(flds)
        flds(fld) = fld + 7
    Next
    rst.Move 4 'Nos situamos en la fila 4
    tbl = rst.GetRows(2, , flds)
    rst.Close
    For fld = 0 To UBound(tbl, 1)
        CurrentDb.Execute _
        "Insert Into MiTabla (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10) " & _
        "Select '" & Left(tbl(fld, 0), 8) & "', '" & Right(tbl(fld, 1), 2) & "', F1, F2, F3, F9, F11, F7, F8, F10 From [Text;Database=C:\dataimport\].quote.csv Where F" & fld + 1 + 7& "=1"
    Next
    
End Sub


Como puedo corregir ese error? o alguna idea para lograr lo que pretendo?

NOTA: Espero haberme explicado lo que pretendo.

De antemano gracias y un saludo.

Erick Gamer


Aprendiz de todos, maestro de nadie.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14746
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Marzo/2024 a las 11:15
Yo diría que el recordset, al tomar desde la fila 1, solo reconoce tener 6 fields.

Yo en su momento lo solucioné vinculando el fichero de Texto en lugar de invocarlo desde el FROM. Al vincular se utiliza una especificación almacenada dónde se puede definir la primera línea de los datos.

El problema será encontrar como se hacia eso (a mi me lo contó Raipon). A ver si tengo un rato y lo busco.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Marzo/2024 a las 19:56
Sigo trabajando en esto cambie solo un valor ahora recibo error 3021 Either BOP or EOF is True, or the current record has been deleted Requested opertation requieres a current record.

Sub Import()
Dim rst As New ADODB.Recordset
Dim tbl() As Variant
Dim fld As Integer
Dim flds() As Variant

    rst.CursorLocation = adUseClient
    rst.Open "SELECT Top 4 * FROM [Text;Database=C:\dataimport\].quote.csv;", CurrentProject.Connection, adOpenStatic, adLockReadOnly

    ReDim flds(rst.Fields.Count - 1 - 7)
    For fld = 0 To UBound(flds)
        flds(fld) = fld + 8
    Next
    rst.Move 4 'Nos situamos en la fila 4
    tbl = rst.GetRows(2, , flds) 'Aqui el error 3021
    rst.Close
    For fld = 0 To UBound(tbl, 1)
        CurrentDb.Execute _
        "Insert Into MiTabla (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10) " & _
        "Select '" & Left(tbl(fld, 0), 8) & "', '" & Right(tbl(fld, 1), 2) & "', F1, F2, F3, F9, F11, F7, F8, F10 From [Text;Database=C:\dataimport\].quote.csv Where F" & fld + 1 + 7& "=1"
    Next
    
End Sub

Alguna idea al respecto?
Aprendiz de todos, maestro de nadie.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1518
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Marzo/2024 a las 22:36
Softjaen hizo un artículo muy bueno sobre los archivos de texto:


Y como es un archivo de texto, se puede abrir y tratar directamente:


En cuanto al error, en el SELECT sólo pides 4 filas; una vez abierto, vas a la cuarta fila e intentas recuperar las 2 siguientes.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 22/Marzo/2024 a las 02:33
Hola pitxiku, eso pense y estoy seguro que select TOP me devolvia filas, pero algo raro esta pasando ya que estoy imprimiendo el rst linea a linea y no me da 4 filas lo que me devuelve son 4 columnas. Que pudiera ser el formato del csv?
Aprendiz de todos, maestro de nadie.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1518
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 22/Marzo/2024 a las 21:29
Puede ser el formato del csv. Pero para saberlo hay que abrir ese archivo con un editor de texto tipo bloc de notas, y ver qué separadores usa, delimitadores, etc.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable