Saltar al contenido

Buscar en archivo de texto y devolver


Recommended Posts

publicado

Sé que con un archivo adjunto todo sería más fácil, pero en estos momentos no lo tengo conmigo....

Tengo un archivo de texto que contiene caracteres de ancho fijo y un rango de celdas en un libro de Excel que contiene valores

Mi deseo (que no consigo encontrar la forma de hacerlo) es crear una macro que busque en el archivo de texto todas las líneas que comienzan por la palabra "FORCE", compruebe si los caracteres de esa linea contenidos entre las posiciones 8 y 17 coinciden con el valor de alguna celda del rango en la hoja y, si coinciden, copie toda la línea del archivo de texto en un archivo nuevo .dat.

Si tenéis una respuesta rápida, lo agradeceré.

Saludos

publicado

Hola Sergio:

En principio se me ocurre una posible solución: Pasa el archivo de texto a una hoja de excel y luego filtra la primera columna con la palabra "FORCE" y posteriormente filtra la posicion 8 y 17 con los datos de las celdas pertinentes. Todo esto lo podrias hacer manualmente pero grabando todos los pasos con la grabadora de macros y despues se puede perfeccionar esa misma macro para eliminar las lineas inutiles o inoperantes.

Sin ejemplo es lo primero que se me ocurre, espero que te haya ayudado u orientado.

Andrés

publicado

pepafg, se trata de archivos te texto de hasta 20 gb con millones de líneas (no exagero). Lo que estaba buscando es un proceso que fuese relativamente rápido. Había pensado en introducir en una matriz los textos a comparar, es decir, las posiciones de la 8 a la 17 del archivo de texto, y los valores del rango de celdas de la hoja, pero no sé por qué, me aparecen errores.

publicado

Buenas, Sergio

He creado este pequeño código y parece que funciona.

Obviamente, se deberían configurar rutas, valores, etc....pero bueno, como idea....


Sub prueba_leer()
ruta = ThisWorkbook.Path & "\"
Archivo = Dir(ruta & "*.txt")
Set obj_FSO = CreateObject("Scripting.FileSystemObject")

'Creamos un archivo con el método CreateTextFile
Set nuevoarchivo = obj_FSO.CreateTextFile(ruta & "Resultado.dat", True)

Open [Archivo] For Input As #1
Do Until EOF(1)
Line Input #1, linea
If Left(linea, 5) = "FORCE" Then
If Mid(linea, 8, 10) = Range("a1").Value Then
nuevoarchivo.WriteLine linea
End If
End If
Loop
nuevoarchivo.Close
Close #1
End Sub
[/CODE]

Un saludo,

Tese

publicado

Algo así había pensado yo, pero no me serviría....

El rango en la hoja de cálculo está compuesto de 23 celdas más o menos. Si el archivo de texto, que tiene un millón de líneas, debe leerse 23 veces, imagina el tiempo que puede tardar en leer 23 millones de líneas....

Te agradezco la respuesta, pero necesitaría algo más rápido.

publicado

Pues quizás se pueda combinar con un bucle que chequee cada uno de esos valores de las 23 celdas, que previamente se hubieran incluido en un Array.

Un saludo,

Tese

publicado

Vamos a ver, Sergio, si con un par de modificaciones al primer código que he propuesto se consigue algo.


Sub prueba_leer()

For Each valor In Range("a1:a23")
cadena = valor & "," & cadena
Next valor

ruta = ThisWorkbook.Path & "\"
Archivo = Dir(ruta & "*.txt")
Set obj_FSO = CreateObject("Scripting.FileSystemObject")

'Creamos un archivo con el método CreateTextFile
Set nuevoarchivo = obj_FSO.CreateTextFile(ruta & "Resultado.dat", True)

Open ruta & Archivo For Input As #1
Do Until EOF(1)
Line Input #1, linea
If Left(linea, 5) = "FORCE" Then
If InStr(1, cadena, Mid(linea, 8, 10)) > 0 Then
nuevoarchivo.WriteLine linea
End If
End If
Loop
nuevoarchivo.Close
Close #1

End Sub[/CODE]

He creado una cadena con los valores y después utilizo InStr para que realice la comparacion de los caracteres 8 a 17 de la línea para ver si esta en dicha cadena.

Un saludo,

Tese

publicado

pepafg, el problema sería que no siempre van a ser 23 datos los que buscar.

tese, tu solución acelera mucho la macro, pero creo que se podría acelerar más.

gracias a los dos por vuestras propuestas.

publicado
pepafg, el problema sería que no siempre van a ser 23 datos los que buscar.

tese, tu solución acelera mucho la macro, pero creo que se podría acelerar más.

gracias a los dos por vuestras propuestas.

amigo Sergio, de verdad que sería de mucha ayuda por lo menos tener una muestra de los datos, la solución que propone el amigo tese1969 se ve muy buena, dificilmente creo que se pueda mejorar a menos que tengamos información sobre los datos a procesar para ver si se puede buscar otra solución, pero bueno, si no se puede subir una muestra ni modo, suerte

publicado

Bueno, Sergio y compañía.....al menos no vamos a peor....:friendly_wink:

Quizás y esto es algo que desconozco, se podría usar una especie de ".Find" y su correspondiente ".Findnext" a lo largo del archivo de texto para ir saltando aquellas líneas que no tengan "FORCE" y ese sería el ahorro.

Mejor realizar la comprobación del "Instr" sobre pongamos 150.000 líneas con "FORCE" que pasar por 1.000.000 de líneas.

Por si sirve como idea para seguir acelerando la ejecución.

Un saludo,

Tese

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      189
    • Comentarios
      99
    • Revisiones
      29

  • Crear macros Excel

  • Mensajes

    • Hola Buenas Noches, Me podrán ayudar a resolver un problema con una planilla que tengo, les comento brevemente. Tengo un archivo que cuenta con 2 hojas, la primera se llama "Movimientos" que básicamente muestra los productos con quiebres que se presentan y la hoja "Producción" que como su nombre lo dice son las producciones de cada producto según fecha de creación. Lo que necesito es lo siguiente: Cada vez que agregue una producción en la hoja "producción", debo ingresar el código creado su cantidad y lote respetivamente, además de la fecha en que se realiza la producción, en caso que sea mayor a las 12:00 se considera PM sino AM. Lo complejo es acá en la otra hoja llamada Movimientos: Esta hoja contiene una columna que se llama "Saldo", que básicamente es la diferencia de lo producido vs el quiebre en esa fecha. Una columna llamada "Cumple", que significa que ese pedido lleva si o no el producto con quiebre. Y una columna "Se preparo", que es si el pedido se preparo o no. Lo complicado viene acá es que si la fecha de la producción que ingrese en la hoja "Produccion", se hace después de la fecha de la hoja movimientos no me debe contar esa producción para efecto de la columna Saldos, si la fecha es igual o menor si se considera y ese saldo que queda disponible se puede ocupar para futuros ingresos de pedidos. Otra conducción es que las producciones siempre se deben asignar al pedido más antiguo de ese código salvo que la fecha de entrega ya haya pasado. La columna "Cumple" es básicamente para poder generar un KPI donde me indique cuales producciones se cumplieron con el plazo y cuales No. Espero me puedan ayudar ya que tengo la siguiente formula pero no sirve ya que me toma las unidades totales y no cumple con la restricción del horario. =SUMAR.SI(Produccion!A:A; $A2; Produccion!C:C) - SUMAR.SI.CONJUNTO($E$2:$E2; $A$2:$A2; A2)) Muchas gracias. Ejemplo..xlsx
    • Hola a ambos, Prueba con: =BYROW(G5:G6;LAMBDA(x;UNIRCADENAS(" - ";1;FILTRAR(E5:E10;B5:B10=x)))) Saludos,
    • Si tienes office 365 puedes usar algo como FILTER ó TEXTJOIN y si no tienes, entonces se puede jugar con las formulas, pero no te recomiendo mucho si son muchos datos, de todas maneras te dejo una fórmula y en vba, ya tu decides cual ocupar, vale Saludos BUSCAR.xlsm
    • Buenos días mis estimados Familia ayudaexcel,  Favor quisiera solicitar su gentil soporte con lo siguiente: Necesito una formula que al buscar encuentre el valor inicial de busqueda y dea todo los resultados encontrado en una celda como ejemplo. si este producto tienes 4 cantidades esta al hacer una formula de busqueda me dea el resultado de las 4 en una celda, dejo el adjunto a espera de su gran soporte.   BUSCAR.xlsx
    • Saludos Sr @Israel Cassales espero este bien quise verificar bien su solución y que las modificaciones que hice funcionarán adecuadamente y al respecto debo decir que su aporte es excelente ya que no solo me ayudo a resolver lo que necesitada sino que también me ayudo a solventar dos cosas más por lo cual estoy muy agradecido 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.