Imprimir página | Cerrar ventana

No lee CSV correctamente

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=86832
Fecha de impresión: 26/Marzo/2026 a las 20:58


Tema: No lee CSV correctamente
Publicado por: JoanJesus
Asunto: No lee CSV correctamente
Fecha de publicación: 22/Diciembre/2023 a las 11:34
Buenos días:
Cada dia recibo de nuestro transportista habitual un informe del estado de las entregas en CSV.
La mayoría de ellos los importo correctamente utilizando, básicamente el código abajo.

En algunos casos un csv que dispone de varias lineas solamente me lee la primera y luego hace EOF.

Si importo el CSV de forma manual por el menu de importación lo hace correctamente.

No quiero utilizar DoCmd.TransferText

Con el código que veis abajo (y algo más) hay archivos que si los lee correctamente y otros no

Si edito con Notepad archivos "buenos" y "malos" aparentemente no tienen nada de diferente.


Los csv recibidos proceden de terceros y es imposible hacerles comprobar los archivos, es como chocar contra una pared.

Necesito alguna pista para solucionar el problema, si lo tiene.
Si se me nota desesperado, estáis en lo cierto

Gracias sea cual sea el resultado

*********************************************************************
 PARTE DEL CÓDIGO UTILIZADO. Es una lectura standard no creo que el error esté ahí.
*********************************************************************

 Dim Resultado() As String
    
    Canal = FreeFile
   
 Open Nombre For Input As #Canal
   
 While Not EOF(Canal)
   
        Line Input #Canal, strlinea
        
      
        
        If Trim(strlinea) = "" Then GoTo otro
  
      Salta = False ' -- Si salta=true no graba la linea
   
    NumLinea = NumLinea + 1
     
        Resultado = Split(strlinea, ";")
       
        strcamp1 = "22" ' -- Codigo Transportista REDUR
        strcamp2 = Trim(Resultado(0)) ' Remitente
        strcamp3 = Trim(Resultado(1)) ' Numero expedicion)
        strcamp4 = Resultado(2) ' Nada
        strcamp5 = Resultado(3) ' Nada
        strcamp6 = Trim(Resultado(4)) ' FechaRecogida transportista
        strcamp7 = Trim(Resultado(5)) ' Estado = "ENTREGADA"
        strcamp8 = Trim(Resultado(6)) ' FechaeNTREGA cLIENTE
        strcamp9 = Trim(Resultado(7)) ' Peso)
        
        
        
        ' -- CONTROLES DE SALTAR LINEA
        ' --
        If strcamp7 <> "ENTREGADA" Then Salta = True
        If strcamp2 <> "REENVIO" Then Salta = True
        If Trim(strcamp3) = "" Then Salta = True ' Numero de expedicion inexistente
        
        
        If Salta = False Then
        
            VerProceso ("ImportarREDUR: " & Nombre & "   Num Expedició: " & strcamp3)
            
            CurrentDb.Execute ("INSERT INTO [tblExpedicionesTransportistaPrevio](CodigoTransportista, NumeroExpedicion, FechaRecogidaTransportista,FechaEntregaTransportista, Kilos, Bultos, ArchivoOrigen) " & _
                " VALUES ('" & strcamp1 & "','" & strcamp3 & "','" & strcamp6 & "','" & strcamp8 & "','" & strcamp9 & "','0', '" & Nombre & "')")
        End If
otro:
    Wend
    Close #Canal



Respuestas:
Publicado por: prga
Fecha de publicación: 22/Diciembre/2023 a las 13:26
Hola.
Esto no soluciona el problema.
Cuando es multilínea y sólo lee la primera, comprueba si sólo lee la primera o lee todo el fichero como si fuese una sola línea.
A mi hace tiempo me pasó que una veces leía la primera línea y otras todo el fichero como si fuese una sóla línea.
Ya comentas.
Un saludo a todos


Publicado por: JoanJesus
Fecha de publicación: 02/Enero/2024 a las 07:24
Efectivamente. lee todo como si fuera una linea.
Paradójicamente, o no,  utilizando "DoCmd.TransferText ..." lo hace correctamente.
  Pues nada, plan B.
Gracias por la ayuda y cerramos hilo por favor



Publicado por: prga
Fecha de publicación: 02/Enero/2024 a las 10:22
Hola.
Sí pasa lo de leer todo el fichero.
Creo y digo creo que el fichero es de procedencia "Unix" que pone como final de línea solo el chr(10)
 Line Input #Canal, strlinea    busca un chr(13) o chr(13) + chr(10) y al no encontrarlo lee todo el fichero.
Por otra parte transfertext, el Excel etc etc leen como final de línea el chr(10) y "desmontan" el fichero correctamente.
Como curiosidad y salvo error, ese fichero lo abres directamente con el excel y sin hacer nada lo guardas también directamente y el 
 Line Input #Canal, strlinea ya lo lee bien pues parece ser que el excel pone como final de línea char(13)+chr(10)
Perdón por el rollazo, pero espero que ayude a resolver la duda
Un saludo a todos



Publicado por: lbauluz
Fecha de publicación: 02/Enero/2024 a las 23:37
Prueba algo asi:


Open "c:\archivounix.txt" for input as "1
do while not eof(1)
line input "1, cadena
cadena = replace(cadena, chr(10), vbnewline)
' imprime cadena
loop
close #1

En teoria deberia csmbiar todos los fin de linea de unix a windows... pero no lo he probado


-------------
El Búho es un pajarraco


Publicado por: JoanJesus
Fecha de publicación: 01/Marzo/2024 a las 11:22
Hola:
Después de muchas pruebas he decidido hacerlo de esta otra forma utilizando:

CreateObject("Scripting.FileSystemObject")

OH! casualidad ha funcionado.

Private Sub ImportarREDUR(Archivo, txtCuenta)
    On Error GoTo ImportarREDUR_Error
    
    Dim fso As Variant
    Dim objStream As Variant
    Dim objFile As Variant
    
    
    
    Dim strlinea As String
    Dim strcamp1 As String
    Dim strcamp2 As String
    Dim strcamp3 As String
    Dim strcamp4 As String
    Dim strcamp5 As String
    Dim strcamp6 As String
    Dim strcamp7 As String
    Dim strcamp8 As String
    Dim strcamp9 As String
    Dim NumLinea As Integer
    Dim n As Integer
    
    Dim Salta As Boolean
     
    Dim Resultado As Variant
    
    '// Intenta abrir  CSV
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(Archivo) Then
        Set objStream = fso.OpenTextFile(Archivo, 1, False, 0)
    End If
    
    
    Do While Not objStream.AtEndOfStream
        strlinea = objStream.ReadLine
        
        ' Debug.Print strlinea
        If Trim(strlinea) = "" Then GoTo otralinea
        Salta = False ' -- Si salta=true no graba la linea
        NumLinea = NumLinea + 1
        
        ReDim Resultado(0)
        Resultado = Split(strlinea, ";")
          
        
        strcamp1 = "22" ' -- Codigo Transportista REDUR
        strcamp2 = Trim(Resultado(0)) ' Remitente
        strcamp3 = Trim(Resultado(1)) ' Numero expedicion)
        strcamp4 = Resultado(2) ' Nada
        strcamp5 = Resultado(3) ' Nada
        strcamp6 = Trim(Resultado(4)) ' FechaRecogida transportista
        strcamp7 = Trim(Resultado(5)) ' Estado = "ENTREGADA"
        strcamp8 = Trim(Resultado(6)) ' FechaeNTREGA cLIENTE
        strcamp9 = Trim(Resultado(7)) ' Peso)
        
        
        
        ' -- CONTROLES DE SALTAR LINEA
        ' --
        If strcamp7 <> "ENTREGADA" Then Salta = True
        If strcamp2 <> "PENDIENTE" Then Salta = True
        If Trim(strcamp3) = "" Then Salta = True ' Numero de expedicion inexistente
        
        
        If Salta = False Then
        
 
            
            CurrentDb.Execute ("INSERT INTO [tblExpedicionesTransportistaPrevio](CodigoTransportista, NumeroExpedicion, FechaRecogidaTransportista,FechaEntregaTransportista, Kilos, Bultos, ArchivoOrigen) " & _
                " VALUES ('" & strcamp1 & "','" & strcamp3 & "','" & strcamp6 & "','" & strcamp8 & "','" & strcamp9 & "','0', '" & Archivo & "')")
        End If
otralinea:
    Loop
        
otro:
    fso.Close
    On Error GoTo 0
    
    
    Exit Sub

ImportarREDUR_Error:

    If Err.Number = 438 Then
        Resume Next
    Else
        MsgBox "nombre: " & Nombre & "  Linea: " & NumLinea
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ImportarREDUR, line " & Erl & "."
    End If
End Sub



Imprimir página | Cerrar ventana