Acceder

Ver la Versión Completa : [ SOLUCIONADO ] Tutorial bucle for con variables


victorjagu
20/12/15, 22:41:04
Hola!

Llevo unos días dándole vueltas a una tarea que pretendo crear para llevar un listado de los últimos capítulos vistos de las series de tv.

Pues todo va bien y lo he conseguido sin problema, pero ahora pretendo y añadiendo detalles y me he topado con un problema

Uso la característica de "listar archivos" a una variable global (%SeriesTV_List) para guardar en ellas todas las series (cada una en un archivo de texto).

Pues pretendo usar un bucle en dicha variable matricial para eliminar el origen con un "buscar y reemplazar" y quedarme solo con el nombre del archivo, pero mi problema es que no sé usar el bucle for con esta variable...

He leído el tema http://www.htcmania.com/showthread.php?t=643221 y no logro enterarme de nada.

La tarea que servirá de backup es la siguiente:

Series TV Backup (113) A1: Listar archivos [ Directorio:%SeriesTV_Path Coincidir: Incluir Archivos Ocultos:Apagado Usar Root:Apagado Variable:%SeriesTV_List ] A2: Mostrar Escena [ Nombre:SeriesTV_Lista Mostrar como:Diálogo oscureciendo lo de detrás Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Encendido Continuar tarea inmediatamente:Apagado ] A3: For [ Variable:%SeriesTV_List Ítems:%SeriesTV_List() ] A4: [X] Buscar y Reemplazar Contenido de Variable [ Variable:%SeriesTV_List Buscar:/storage/sdcard0/config backup/Tasker/Series_TV/ Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En: Reemplazar Coincidencias:Encendido Reemplazar Con: ] A5: End For A6: [X] Limpiar variable [ Nombre:%SeriesTV_List* Coincidencia de Patrón:Encendido ] A7: Flash [ Texto:%SeriesTV_List() Largo:Apagado ]

Si en el for le pongo %SeriesTV_List1, entonces sí que me lo hace en esa subvariable, pero lo que quiero es que lo haga en toda la matriz...

¿Alguien puede explicarme cómo hacerlo? Supongo que con un tutorial de cómo usar el for sería capaz de apañarme... Si tuviera que hacerlo con VBA de excel sería pan comido pero así, uff, supongo que por ser la primera vez...

Gracias por la ayuda!

mlesir
21/12/15, 15:44:11
1- Tienes marcado no continuar la tarea en el mostrar la escenaa con lo cual no hará el resto hasta que se quite esa escena. Pero bueno este es el detalle menos importante.

2- Te explico lo que estas haciendo realmente con tu tarea:

Con A1 Metes el resultado de listar en un array: %SeriesTV_list, asi que tenemos

%SeriesTV_list1 = /rutadirextorio.......
%SeriesTV_list2 = /rutadirectorio.....
etc.....

Ahora en el for le estas diciendo que coja todos los valores del array %SeriesTV_list utilizando el simbolo "()". Esto esta bien.
Como variable del for, tasker te hace caso y mete cada valor de ese array q has utilizado en items en %SeriesTV_list.
En A4 reemplaza las coincidencias con nada, o sea lo quita, y lo guarda en %SeriesTV_list.

Hasta aqui estaria bien, si pusieramos un flash de la variable %SeriesTV_list veriamos que podria tener un valor tal que asi:

"Walking_dead01x07"

Pero!.... vuelve a hacer el for, coge el segundo elemento del array y se lo mete a %SeriesTV_list borrando lo anterior.

Resumiendo: estas machacando lo que vas haciendo porque estas utilizando siempre la misma variable. En el for de tasker la variable que se usa para meter los items o valores es siempre la misma.

Te pongo un sencillo ejemplo de como se podria hacer:

Tarea de ejemplo (110)
A1: Establecer variable [ Nombre:%Aaa A:uno,dos,tres,cuatro Calcular:Apagado Añadir:Apagado ]
A2: Separar variable [ Nombre:%Aaa Separador:, Eliminar base:Apagado ]

Lo anterior es para que nos cree un sencillo array.

A3: For [ Variable:%for Ítems:1:%Aaa(#<) ]
A4: Flash [ Texto:%Aaa(%for) Largo:Apagado ]
A5: End For
(
EDITO: No me he dado cuenta y he escrito el post a medias. Bueno sigo:)

Con 1:%Aaa(#<) le decimos q coja desde el valor del indice del array 1 hasta el valor del ultimo indice del array. O sea que si tienes un array con siete elementos la variable %for ira cogiendo los valores 1,2,3... hasta 7.
El indice de un array se puede indicar poniendo una variable entre parentesis en tasker. Esto es lo que hace el flash.

Creo que con todo esto ya veras la manera de que funcione tu tarea, si no es asi dimelo.

victorjagu
22/12/15, 18:34:20
Gracias Mlesir por la respuesta, pero sigo sin entenderlo. Puede que esté un poco espeso.

Digamos que a pesar de las explicaciones, sigo sin ver qué incluir en cada campo del for y del buscar y reemplazar para que funcione lo que pretendo. Estoy perdidísimo... :(

cace0353
23/12/15, 13:11:31
Bueno, si lo que quieres es una lista de todas tus series para presentarlas en una escena con un elemento Rueda, ya has empezado bién, puesto que creas la matriz "%SeriesTV_List" con "Listar archivos"

Vamos a ver como limpiar los elementos de esta matriz, quitando el path y dejando sólo el nombre de la serie:
Como te orienta mlesir debes ejecutar el bucle de manera que se guarden los cambios. Para ello puedes substituir cada uno de los elementos de la matriz original por el nombre corto a medida que se va ejecutando el bucle For.

Veamos el bucle

For variable: %contador Items: 1:%SeriesTV_List(#)
Buscar y Reemplazar Contenido de Variable Variable: %SeriesTV_List(%contador)
Buscar: /storage/sdcard0/config backup/Tasker/Series_TV/
Reemplazar coincidencias: activado y Reemplazar con: (nada)
End For

El error que cometes es que no almacenas los elementos de la matriz con su índice a medida que los vas operando...

WillyWeb
23/12/15, 13:26:13
Vemos si yo te lo puedo explicar de otra forma :oh:

La movida está en tu acción A3...

Al poner "Ítems:%SeriesTV_List()" recorres todos los elementos del array poniendo en cada vuelta el valor de cada uno de ellos en "Variable:%SeriesTV_List". Es decir, que no estás tocando directamente cada valor del array, sino una copia guardada temporalmente en la variable "SeriesTV_List".

Con el sistema que te propone mlesir crearás una variable numérica que puedes usar como índice para apuntar directamente a cada valor del array de esta forma %SeriesTV_List(%for) siendo %for ese número/índice.

¿Qué tal ahora? ... :loco:

cace0353
24/12/15, 09:54:34
Otra cosa, @victorjagu (http://www.htcmania.com/member.php?u=1199622),

Tengo alguna experiencia en el manejo y procesamiento de bases de datos almacenadas como matrices y, te aconsejo que trabajes con variables locales siempre que puedas.

En la tarea que propones haces una lectura de la lista de los nombres de series guardadas cada vez que la ejecutas. En este caso es más rápida la ejecución de la tarea si la salida de la acción "Listar archivos" es una variable local, en tu caso podria ser "%seriestv_list"
Usando variables globales se guardan en memoria RAM como datos del programa los valores de todos elementos de la matriz, que ya no necesitarás cuando salgas de la tarea. Por tanto: con variables locales ganas velocidad de ejecución y espacio RAM.

El resto de la tarea (el bucle que creo que ya habrás solucionado) se ejecuta sobre esta variable local.

Feliz Navidad a todos

victorjagu
24/12/15, 18:25:28
Perdonad por contestar tan tarde, el curro me tiene asfixiado :(

Muchas gracias a todos, ahora sí que lo he entendido y he logrado seguir "pa'lante" jeje con la tarea.

cace0353 (http://www.htcmania.com/member.php?u=304484), gracias x el consejo. Estaba usando la variable global para poder ver en el apartado "variables" de Tasker el resultado de lo que estaba haciendo, a ver si así lograba yo solo resolver la cuestión... sin éxito hasta ahora =)

Gracias de nuevo, una cosa más que he aprendido. Ya puedo seguir desarrollando mi tarea.

Feliz Navidad y Feliz año cargado de buenas oportunidades!