|
Responder
|
| Autor | |
JoanJesus
Habitual
Unido: 28/Agosto/2007 Localización: Catalunya Estado: Sin conexión Puntos: 110 |
Tema: No lee CSV correctamenteEnviado: 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 |
|
![]() |
|
prga
Moderador
Unido: 16/Noviembre/2004 Localización: España Estado: Sin conexión Puntos: 3535 |
Enviado: 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 |
|
![]() |
|
JoanJesus
Habitual
Unido: 28/Agosto/2007 Localización: Catalunya Estado: Sin conexión Puntos: 110 |
Enviado: 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
|
|
![]() |
|
prga
Moderador
Unido: 16/Noviembre/2004 Localización: España Estado: Sin conexión Puntos: 3535 |
Enviado: 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 |
|
![]() |
|
lbauluz
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 29/Marzo/2005 Localización: La Gloria Estado: Sin conexión Puntos: 3878 |
Enviado: 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
|
|
![]() |
|
JoanJesus
Habitual
Unido: 28/Agosto/2007 Localización: Catalunya Estado: Sin conexión Puntos: 110 |
Enviado: 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 |
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |