Shell   05-12-2022, 15:59
#1
Buenas!.

Hace un tiempo creé un ejemplo y no había forma de recordar su nombre. ( Rebuscado que soy a veces ).
Imaginar le puse "distancias" como nombre Big Grin , como para saber que es eso con ese nombre. Tongue

Como era un proyecto gráfico la solución más simple era encontrar la palabra "Paint" dentro de muchos archivos y proyectos de Gambas.
Como no sé si es posible hacerlo con Gambas directamente, me apoyé en el comando grep de bash.

Cuando uso la instrucción grep, este me devuelve el nombre de la ruta, ":" y donde se encuentra, ejemplo:
 
Cita: /home/miusuario/Programacion/PracticasGambas/PracticaTemporal/EjemploMultipleTemporal/.src/Cuadrado.class:    Paint.LineWidth = 2

Con eso sabemos que el separador es ":"

¿ Qué nos podemos encontrar ?. Que la palabra Paint se repita muchas veces "por ejemplo" en el archivo Cuadrado.class
Entonces voy descalificando nombres de archivos repetidos para que solo me lo muestre una vez.

Esa es la función principal. No he usado reloj para que el usuario se enfade. (Cuando el proceso tarda y no sabemos que se ha colgado la aplicación). Es que no se lo añadí. Rolleyes

Código:
Public Sub EncontrarCadenaRecursivamenteEnArchivosDeUnDirectorio(ruta As String, palabra As String, Optional separador As String = ":") As String[]
 
  Dim archivo As String
  Dim partesdeunaruta As String[]
  Dim slista As String
  Dim arepes As New String[]
  Dim asinrepes As New String[]
  Dim pos As Integer
 
  Shell "grep" & " -ir " & palabra & " " & ruta To slista
 
  For Each archivo In Split(slista, "\n")
    pos = InStr(archivo, separador)
    If pos > 0 Then arepes.Add(Left(archivo, pos - 1))
  Next
 
  For Each archivo In arepes
    partesdeunaruta = Split(archivo, "/", "'", True)    
    If Not asinrepes.Exist(partesdeunaruta[partesdeunaruta.Max - 2]) Then asinrepes.Add(partesdeunaruta[partesdeunaruta.Max - 2])    
  Next
 
  Return asinrepes.Sort()
 
End

Me he centrado en buscar solo archivos que contengan "Paint".

Y esto es el código del botón que llama a esa función.
Como son cosas de probar rápido he usado un Textarea. Smile

El nombre del proyecto por defecto lo encuentro, dos pasos más atrás de la ruta completa comenzando por la derecha.
El array partesdeunaruta contiene cada elemento una parte de la ruta como dice su nombre. Con este averiguo el nombre del proyecto.
Todo muy simple.

Código:
Public Sub btnBuscar_Click()
 
  Dim lista As New String[]
  Dim nombre As String
  Dim ruta As String = "ruta_a_tus_proyectos_Gambas"
 
  TextArea1.text = ""
 
  lista = EncontrarCadenaRecursivamenteEnArchivosDeUnDirectorio(ruta, "Paint")
 
  For Each nombre In lista
    TextArea1.Text &= nombre & gb.NewLine  
  Next
 
End

Moraleja: Pon un buen nombre a tus proyectos y usa las dos cajas de texto.

Soy requerido en la cocina...

Saludos
Archivos adjuntos
.gz
BuscarCoincidencias2-0.0.1.tar.gz (Tamaño: 12.11 KB Descargas: 2)
Última modificación: 05-12-2022, 16:02 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
cogier   05-12-2022, 18:37
#2
¿Ayudará esto?

InFile

[Imagen: InFile.png]
Shordi   05-12-2022, 20:59
#3
¿Has probado los comandos "grep -r ..." y "rgrep"

Saludos

No podemos regresar
Shell   06-12-2022, 00:30
#4
(05-12-2022, 20:59)Shordi escribió: ¿Has probado los comandos "grep -r ..." y "rgrep"

Si, vuelco la salida en una cadena.  Con rgrep no he probado.
 
(05-12-2022, 18:37)cogier escribió: ¿Ayudará esto?

Este si. Wink

Vaya, si que le dedicaste código. Desde luego te esmeraste creándolo.
Gracias.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 5 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.