Importar csv y transponer
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86891
Fecha de impresión: 26/Marzo/2026 a las 20:57
Tema: Importar csv y transponer
Publicado por: Erick Gamer
Asunto: Importar csv y transponer
Fecha de publicación: 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.
|
Respuestas:
Publicado por: xavi
Fecha de publicación: 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
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: Erick Gamer
Fecha de publicación: 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.
|
Publicado por: pitxiku
Fecha de publicación: 21/Marzo/2024 a las 22:36
|
Softjaen hizo un artículo muy bueno sobre los archivos de texto:
- http://www.mvp-access.es/softjaen/articulos/texto/jet_text_isam.htm" rel="nofollow - Trabajar con los datos de un archivo de texto (mvp-access.es)
Y como es un archivo de texto, se puede abrir y tratar directamente:
- https://learn.microsoft.com/es-es/office/vba/language/reference/user-interface-help/textstream-object" rel="nofollow - Objeto TextStream | Microsoft Learn
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.
|
Publicado por: Erick Gamer
Fecha de publicación: 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.
|
Publicado por: pitxiku
Fecha de publicación: 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.
|
|