¡Menos de un segundo! ¡A mí me tarda 23!
¿Qué cadena buscas exactamente? ¿
'name=""Mamba Edge""', directamente
'Mamba Edge'? Está claro que en cada ordenador costará una cosa, y éste es un pobre XP a 2GHz con un disco no muy rápido, pero la diferencia es bárbara.
Claro que la comparación hay que hacerla con los dos programas en el mismo sistema, a mí esos 23 segundos se me reducen a 2.7 con el método sin Find.
Tengo que decir que busco en los archivos ordenados alfabéticamente, sería interesante saber en cuántos has buscado antes de encontrar el Melba Edge, porque igual si los tienes ordenados de otra manera resulta que es de los primeros en buscar. A mí cuando encuentra
15500-15599.txt con el resultado, ya ha buscado antes en 155 archivos, vaya, casi todos
Sería interesante que nos pasaras un código funcional para que probemos. Funcional es que se pueda ejecutar, para reducirlo sin ponerle GUI le puedes poner a mano los valores de las variables de la carpeta de archivos y el texto de búsqueda.
Respecto a ese error que comentas es típico de usar una variable que aún no tiene ningún valor. Por ejemplo si haces:
$a = $b + 2
y
$b aún no vale nada, pues te da un error porque no sabe qué tiene que sumar.
Efectivamente para usar una variable en diferentes funciones la tienes que declarar como
Global. Para eso declárala
FUERA de cualquier función, en el programa principal. Las variables locales (con
Local) se declaran
DENTRO de una función, y sólo son visibles en esa función.
NO uses DIM, está ahí por razones históricas y los desarrolladores desaconsejan su uso.
Sí, has retocado el ejemplo, pero has quitado el bucle, que es lo más importante. El bucle es lo que pasa de archivo a archivo, así que te quedas en el primero. De la misma manera te falta otro bucle que lea todas las líneas del archivo (o hasta que encuentre el item).
Al cambiar
FileReadLine por
FileRead lo que haces es leer el archivo entero, al no leerlo por líneas no sabes cuál es. Sí que es con
FileReadLine pero con un bucle que vaya leyendo las líneas. Es más, si miras la ayuda de
FileReadLine precisamente el ejemplo lee un archivo entero línea a línea. Como ves hay un bucle que las recorre, ¡no lo quites!
Es difícil probar un código a mitad. Si es posible pásanos códigos que se puedan ejecutar. Por ejemplo sería interesante saber qué forma tienen las variables
$Directorio y
$valID. Creo que
$Directorio tiene la barra final de directorio,
$valID no sé cómo será, y sería interesante hacer lo mismo que tú para que nos pasen las mismas cosas en la pruebas. (No es lo mismo buscar 'Mamba Edge' que 'name="Mamba Edge"', por ejemplo).
Venga mira lo de los bucles y nos dices. Algunas sugerencias y correcciones:
.- ¿Por qué no buscas con
FileFindFirstFile sólo los archivos de texto
"*.txt"? Por asegurarse.
.- Después de
FileFindFirstFile es buena idea mirar si hay archivos, tal como hace en el ejemplo. Ah, veo que lo haces luego... ¡pero hay que hacerlo antes de trabajar con los archivos! Esa condición del
If $search = -1 hay que ponerla justo después del
FileFindFirstFile, sino no tiene sentido.
.- Estás mirando mal los códigos de error de
StringInStr . Los errores los suelen devolver las funciones en la macro
@error, no en el valor que devuelven (aunque si hay error a veces retornan valores especiales). Así por ejemplo es cierto que
StringInStr devuelve
0 si no encuentra la cadena (pero eso no es exactamente un error, pues el proceso se ha ejecutado correctamente). Pero el error
-1="Invalid 'start' or 'occurence' parameter given." se comprueba mirando
@error:
Código: Seleccionar todo
If @error = 1 Then
MsgBox(0,"","Invalid 'start' or 'occurence' parameter given.")
Elseif $Resultado = 0 Then
MsgBox(0,"","Substring not found.")
EndIf
La comprobación de
FileOpen la tienes bien, ahí devuelve el error en el retorno de la función. Esto demuestra que hay que mirar bien la documentación de las funciones, para ver cómo trabajan y cómo devuelven los errores, porque cada uno lo hace de una manera (pero atento al mecanismo de
@error, en AutoIt se usa mucho)
.- Cuando abras un archivo, ciérralo cuando termines de trabajar con él. Es decir, como tienes un
FileOpen($Directorio & $asdf), debería haber un
FileClose($Directorio & $asdf) cuando termines de trabajar con él.
.- Esto último ya es cuestión de gustos pero yo no pondría a variables el mismo nombre que las funciones (como haces con
FileRead), puede ser un lío, por ejemplo si te da un error con
FileRead puede ser un poco lioso saber si se está refiriendo a la función o a la variable.
Ah, pásanos el código que busca con
Find, quiero probarlo en mi ordenador a ver si me va más rápido que el mío.