|
||
|
![]() |
![]() |
Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
Herramientas |
#1
|
||||
|
||||
CONSULTA DE UNA TABLA DE DATOS DE EXCEL EN TASKER (nivel básico)
Hay lenguajes de programación específicos para manejar bases de datos (Sqlite3, por ejemplo). Sin embargo, para los que hacemos nuestros propios programas de bricolage con Tasker, se hace muy trabajoso aprender a programar en otro lenguaje sólo para hacer cuatro "cositas"
Hace tiempo que utilizo este procedimiento para preparar mis tablas de datos Excel en el PC para su uso con Tasker, y hoy me he decidido a compartirlo en forma de tutorial. No veremos opciones de filtraje con condiciones ni ordenación por columnas ya que se escapa de la pretensión inicial. Tampoco hay posibilidad para modificar los datos. En Tasker habrá quizás procedimientos más eficientes que los que propongo, por esto me declaro totalmente abierto a vuestras aportaciones para mejorarlo entre todos. A.- PREPARACIÓN DE LOS DATOS Partimos de que ya tenemos nuestra tabla abierta y llena en Excel. En las celdas podemos tener nombres-apellidos, nombres de archivo de imagen.extensión, URL de páginas web, valores numéricos, direcciones postales, teléfonos, coordenadas GPS, etc. Pasos a seguir: En Excel 1.- Ordenar la tabla por la primera columna (procurar poner en la primera columna los datos base de la tabla. P.e.: En una tabla de alumnos/notas, situar en la columna A los Apellidos, Nombre de los alumnos. En una tabla de productos/precios situar en la columna A las referencias o nombres de los productos) 2.- Eliminar la fila de encabezamiento (títulos de las columas). 3.- Eliminar las "hojas" extras que hubiera, colores, formatos de texto como los separadores de miles, negrita, etc. Si hay datos numéricos decimales substituir las , por . (punto) en las columnas afectadas ya que en Tasker, para las operaciones matemáticas, es necesario que el separador decimal sea el punto. 4.- En "Guardar archivo como..." elegir CSV, datos separados por coma (; en realidad) Esto generará un archivo con extensión .csv que deberemos cerrar y guardar con el nombre que queramos. Excel nos dice que se perderán funcionalidades, pero le decimos que si, que lo aceptamos. Y salimos de Excel. En Windows 5.- Situándonos sobre el archivo CSV generado clicamos una vez sobre él con el botón derecho y elegimos "Abrir con..." en el menú contextual que se abre. Elegimos "Microsoft Word". Cuando nos aparezca el archivo lo veremos como texto, con las filas separadas con saltos de línea y los datos de las columnas separadas por ; Le damos a "Guardar como...", seleccionamos el nombre que ya teníamos con la extensión .txt y, en el menú que se nos abre, seleccionamos la opción "Otra codificación", entonces en la parte derecha vamos al final de la lista y marcamos sobre la opción "Unicode (UTF-8)" Ya podemos guardar y cerrar Ms Word. (Esta codificación es la que usa Tasker y nos permite ver correctamente los caracteres tal y como estaban en el archivo original, según posteó @Caravantes en el hilo de trucos) 6.- Este archivo contiene toda nuestra base de datos. Podeis copiarlo a vuestro dispositivo o ponerlo en Dropbox. Si tenemos instalado DropSync tambien podemos sincronizarlo con el que tenemos en el PC, y así, cada vez que actualizemos el .CSV y el TXT original, tendremos los datos en el móvil actualizados. B.- CONSULTA DE LA BASE DE DATOS EN TASKER USANDO ACCIONES JavaScriptlet A destacar que todo lo haremos usando solamente variables locales. Para la consulta de nuestra base de datos necesitaremos, en Tasker, lo sigüiente: · Una Tarea, que llamaré, p.e. GESTION, para extraer la información del archivo generado en el apartado A. · Una escena LISTA que nos mostrará los nombres representativos de cada línea de datos (los de la columna A) y que servirá para seleccionar a que línea de datos queremos acceder para verlos en la escena FICHA · Una escena FICHA diseñada a nuestro gusto (cuadros de texto, imágenes, mapa, botones…) para mostrarnos todos los campos de cada linea. (Todos los datos del alumno N, todos las características del producto P, etc.) B.1 Tarea GESTION Partimos del archivo de texto en el que, como hemos visto, las filas de datos de la tabla se encuentran separados con saltos de linea y los datos pertenecientes a cada columna dentro de cada fila están separados por ; Creamos una nueva tarea GESTION Utilizamos una acción "Leer párrafo" del grupo "Archivo" (valiosísima aportación del compañero @WillyWeb ya que la acción "Leer archivo" no extraia los datos de manera que JavaScript los entendiera mientras que si lo hace en Tasker puro): Tasker Acción: Leer párrafo Archivo: seleccionamos el archivo que contiene los datos con la lupa Párrafo: 1 A la variable: %datos (ó el nombre que queramos, pero en minúsculas, como variable local) Ahora es cuando vamos a generar las matrices que contienen los datos de las filas y los de cada columna usando intrucciones en JavaScript. (Os recomiendo la lectura del tutorial de @maid450 linkado en el post #1 de este hilo) Tasker Acción : Código > JavaScriplet Usaremos una única acción con las sigüientes instrucciones escritas (no olvidéis colocar los ; al final de las lineas que lo llevan). En rojo la explicación de que hacemos en cada línea y que no se escribe en el código: var columna_a = []; declaramos el array que contendrá los datos de la columna A de la tabla var columna_b = []; declaramos el array que contendrá los datos de la columna B de la tabla ------- declaramos tantos arrays como columnas tengamos en la tabla original ------- var columna_n = []; array que contendrá los datos de la última columna con datos que tengamos datos = (datos.split("\n")); Dividimos la variable de tasker %datos (en JS se escriben los nombres de variable sin el % delante) que resultaba de la acción "leer párrafo" por líneas, usando como separador el código de salto de línea "\n" y almacenando el resultado en un array local "datos" for (i=0 ; i<datos.length; i++) Iniciamos el bucle que se repetirá desde i=0 y mientras i sea menor que el número de líneas, incrementando el valor de i en 1 a cada vuelta { linea = (datos[i].split(";")); aquí asignamos a la variable "linea" el contenido entero de cada linea datos{i] de nuestra hoja de Excel y la dividimos por el carácter ; A cada vuelta del bucle se sobreescribe el valor del array "linea" ya que no nos interesa conservarlo columna_a[i] = linea[0]; y creamos el array conteniendo los datos de la columna A de manera que en la primera vuelta (cuando i = 0) pone el valor que hay en la primera celda de la primera fila. En la segunda vuelta pone el valor de la primera celda de la segunda fila,.... columna_b[i] = linea[1]; columna_c[i] = linea[2]; ………… columna_n[i] = linea[n]; datos de la columna N } En este punto ya tenemos generadas las matrices lineales de datos para usar en Tasker y con una sola acción! Con una acción "Establecer variable" asignamos valor a la variable %titulo que encabezará la escena LISTA Para acabar añadiremos (luego, cuando hayamos preparado la escena según se explica en el punto B.2.1) una llamada a la escena LISTA: acción "Mostrar escena" B.2 CONSULTA DE LOS DATOS A destacar que todo el trabajo se hace sin salir de la tarea GESTION que llama a la escena LISTA. Las subtareas para operaciones concretas se escribirán en la pestaña "click en ítem" que tienen los elementos "texto", "botón", "imagen", "rectángulo" que colocaremos en las escenas. Esto lo hacemos así porque nos permite escribir la aplicación usando sólo variables locales ya que no salimos de la tarea principal. (Aunque podríamos usar llamadas a subtareas pasándoles en %par1 y %par2 los parámetros necesarios, resulta más claro y simple así) B.2.1 Creamos una Escena LISTA a toda pantalla con un elemento "Texto" para el título de la escena en la parte superior (que mostrará el valor de la variable %titulo) y un elemento "Menú" que ocupe el resto de la pantalla. Más adelante podemos añadir botones para acciones más elaboradas como cambiar la columna de ordenación, filtrar los datos por los valores de alguna columna (p.e. clientes de determinada localidad, productos de hasta x euros, etc), o elemento "Texto" que nos indique el número de datos mostrados: %columa_a(#), etc... En el elemento central "Menú", durante la ejecución, nos aparecerá luego la lista deslizante de datos de la columna A Parámetros del elemento Menú de la escena LISTA: Origen: Matriz de variables Variable: %columna_a Modo de selección: Simple Disposición: Clicamos sobre el dibujo del rectangulito para configurar las lineas de nuestro menú... Este elemento es el mas laborioso, con mucho, de configurar, ya que hay que establecer medidas altura/anchura, color, tamaño del texto, para el "label". Os aconsejo que oculteis los otros elementos ("icon" y "index"), extendiendo el "label", a izquierda y derecha, por encima de ellos ya que no los vamos a usar Cuando terminemos le damos al botón de atrás. En la pestaña "Click en ítem" del elemento "Menú" pondremos, cuando la hayamos creado en el apartado que sigue, la acción "Mostrar escena" Nombre de la escena: FICHA, Mostrar como: Actividad, pantalla completa, sin título. Mostrar boton salida: OFF B.2.2 Creamos una escena FICHA para mostrar los resultados correspondientes al elemento seleccionado en la escena LISTA En esta escena FICHA podemos tener elementos de cualquier tipo en los que pondremos los valores referenciados con "%columna_a(%tap_index)" ,"%columna_b(%tap_index)", "%columna_c(%tap_index)" "%columna_d(%tap_index)" etc. La variable %tap_index, creada por Tasker al clicar sobre un nombre de la lista, contiene el nº de orden del elemento que hayamos elegido. También podemos poner en la Escena botones o imágenes (Ejemplos: una imágen con el icono de la aplicación Teléfono que al pulsarlo -pestaña "Clik en item"- tenga una acción Llamar al dato que contiene el nº de teléfono -en el ejemplo: %columna_f(%tap_index)-, una imagen con el icono de la aplicación Maps para navegar a la dirección -en el ejemplo: @columna_a(%tap_index),columna_d(%tap_index) es decir "población,provincia"-, un cuadro de texto que muestre el PVP multiplicando un dato por un coeficiente, etc, etc...), siempre apuntandp al dato que queremos: %columna_n con la posición seleccionada %tap_index (No olvideis poner los"Mostrar escena:FICHA" en el "Clic en Item" del menú y al final de la tarea GESTION...) Y ya está, tenemos un visor de nuestros datos de Excel que nos permite navegar por sus valores y ejecutar varias acciones con los datos mostrados. En el ejemplo que adjunto hay dos botones para explorar adelante y atras toda la base de fila en fila. Para hacerlo hay que poner en la pestaña "Click en ítem" una acción Establecer variable %tap_index A %tap_index+1 (-1 para ir atrás...) seguida de una acción "Mostrar escena" > FICHA. Enfín, espero que, con este tutorial, un buen número de taskeros suban un peldaño en su nivel de programación y se atrevan con cosas más "gordas". Teniendo la base no és difícil! --------------------------------------------------------------------------------------------------------------------------- Para ahorraros trabajo os pongo, más abajo, el ejemplo que he preparado y que os ayudará a entender como funciona todo. También podeis adaptarlo para vuestros usos. La base de datos es una tabla con los 500 primeros nombres de pueblos de Catalunya sacada de la web de entes locales de la comunidad y reducida (en Excel) a 11 columnas. Total 5.500 celdas… En principio lo hice con los casi 900 nombres y Tasker "petaba" a la hora de mostrar las fichas… Tanto el nombre de la tarea como los de las escenas coinciden con los del tutorial. También coinciden los nombres de variables (%columna_a, %columna_b,… ) para facilitar el seguimiento de lo expuesto aquí en Tasker. No obstante recomiendo que los nombres que uséis en vuestras aplicaciones futuras sean menos abstractos (%poblacion, %c_postal, %comarca,…). Las escenas están preparadas para una pantalla de 1080*1920 puntos. Si vuestro dispositivo no tiene esta resolución deberéis modificar los elementos y el tamaño del texto para ajustarlos. Enlace al ZIP que contiene el archivo base CSV, el TXT generado, y los XML correspondientes a la tarea GESTION y a las escenas LISTA y FICHA. Solo os falta copiarlo a vustro dispositivo, descomprimirlo y importar los XML de la tarea y de la escena... También deberéis comprobar y/o modificar la ruta del archivo de texto en la acción "Leer párrafo" de la tarea. https://dl.dropboxusercontent.com/u/13481585/Gestion_BD.zip -------------------------------------------------------------------------------------------------------------------------- Saludos a todos y buen provecho! NOTAS: - La primera población (Abella de la Conca) está repetida ![]() - La Tarea adjunta en XML incorpora dos acciones para mostrarnos el tiempo de ejecución en la escena LISTA - La escena LISTA lleva además un indicador de elementos mostrados - Aunque seria posible crear una escena-formulario modificar nuestros datos y actualizar el archivo TXT no es aconsejable. Efectivamente, el Excel con extensión CSV no podemos modificarlo desde aquí. Por tanto el mantenimiento de nuestros datos debe hacerse en Excel y luego repetir el proceso del apartado A de este tutorial.
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 09/03/16 a las 09:55:17. Razón: No aparecia el link al post de maid450. No se veia completa una de las lineas de código JS |
Los siguientes 5 usuarios han agradecido a cace0353 su comentario: | ||
|
#2
|
||||
|
||||
Excelente. Muy bien explicado.
![]() Y se nota que te has peleado un poco con las escenas. ![]()
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
Gracias de parte de: | ||
#3
|
||||
|
||||
Aunque dices que es muy trabajoso la verdad creo que resultaría mucho más práctico (y creo que más rápido también) crear una base de datos sqlite3 (u otro, pero mejor sqlite por estar más extendido), una tarea de tasker para meter los datos csv en ella y manejar todo a base de sqlite.
Es muy sencillo y rápido de aprender, mucho más que lenguajes típicos de programación, por lo menos a un nivel básico (y más usando asistentes para elaborar las consultas), y también es mucho más potente y menos engorroso. Puedes realizar modificaciones de forma sencilla, múltiples tablas seleccionando solo las columnas que necesitemos en cada momento, agrupar valores aplicando fórmulas para hallar medias (sumas o cualquier otro cálculo), reemplazar ciertos valores por otros, realizar cálculos todo lo complejos que queramos usando tablas auxiliares temporales, acceder a los datos desde programas externos compatibles con sqlite, almacenar consultas que accedan a distintos datos y realicen distintas operaciones según la necesidad (ocupando una sola linea cada una), etc... Para manejar una tabla suelta no creo que tenga dificultad alguna ni necesario buscar documentación siquiera. Es muy intuitivo (el equivalente a SELECCIONAR columna1, columna2 DE tabla ORDENADO POR columna1) y vale con usar el asistente de cualquier programa de gestión sqlite para elaborar las consultas las primeras veces. Y está el bonus de que una vez aprendido el lenguaje será mucho más fácil acceder a datos de aplicaciones externas para otros usos. |
Gracias de parte de: | ||
#4
|
||||
|
||||
Aunque dices que es muy trabajoso la verdad creo que resultaría mucho más práctico (y creo que más rápido también) crear una base de datos sqlite3 (u otro, pero mejor sqlite por estar más extendido), una tarea de tasker para meter los datos csv en ella y manejar todo a base de sqlite.
![]() Me encantaria mejorar mis "programillas" (acostumbro a manejar en ellos tablas de Excel) pero tampoco me estimula tener que aprender todo un lenguaje de programación. Creo que bastaria con cuatro herramientas básicas como las que sugieres... Saludos
__________________
Me apasiona volar, pero con los pies en el suelo...
|
#5
|
||||
|
||||
Añado algunos comentarios y matizaciones: - Aunque seria posible crear una escena-formulario modificar nuestros datos y actualizar el archivo TXT no es aconsejable. Efectivamente, el Excel con extensión CSV no podemos modificarlo desde aquí. Por tanto el mantenimiento de nuestros datos debe hacerse en Excel y luego repetir el proceso del apartado A de este tutorial.
![]()
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
Gracias de parte de: | ||
#6
|
||||
|
||||
Me parece perfecto, porqué no haces un tutorial básico para que todos aprendamos un poco y podamos emplearlo?
Me encantaria mejorar mis "programillas" (acostumbro a manejar en ellos tablas de Excel) pero tampoco me estimula tener que aprender todo un lenguaje de programación. Creo que bastaria con cuatro herramientas básicas como las que sugieres... Saludos ![]() Para un uso básico sin conocimientos previos en un principio lo más complicado/lioso creo no es el lenguaje en sí sino preparar los archivos/base de datos: - Podemos coger una base de datos que ya esté creada (de alguna app instalada) y hacer una copia en una carpeta personal o crear una base de datos nueva. Por ejemplo usando SQLite Editor -> New Database -> seleccionamos ruta donde la queremos crear y nombre de la base de datos (por ejemplo tasker_pruebas). - A continuación, en TABLES, damos a settings y NEW TABLE. Escribimos el nombre de la tabla, por ejemplo POBLACIONES y ahora hay que añadir los campos que queremos que tenga. - De los datos que hay que rellenar, para empezar los importante son nombre del campo (obviamente), como NOM_POBLACION, y sobre todo el tipo de dato: número entero, real -número con decimales-, texto, blob (para almacenar datos binarios, como fotos, por ej), fecha, timestamp y time. Para poblaciones podríamos tener nom_poblacion text, c_p text, habitantes, int. Los otros parámetros no son fundamentales para un comienzo. para ejecutar la consulta desde tasker usar el comando shell con; sqlite3 <ruta de la base de datos>/nombre_base_datos.db "<consulta>" por ej, asumiendo que usamos tres variables en tasker: sqlite3 /storage/emulated/0/Download/test_base_de_datos.db "insert into poblaciones (nom_poblacion,c_p,habitantes) VALUES ('%var_nom_pob','%var_c_p',%var_numhab);" Luego para leer datos lo mismo que antes pero ahora añadiendo una variable para recoger el resultado de la consulta. y usando SELECT <campos separados por comas> FROM <tablas separadas por comas> WHERE <condiciónes> ORDER BY <orden> LIMIT <máximo número filas que queremos> Para construir las consultas mejor usa el SQLite Debugger, mejor interface que el otro para ello. NOTAS: - si pones SELECT * ...., el asterisco indica que coja todos los campos - si el select incluye varios campos, en el texto devuelto a la variable indicada estos vendrán separados por tuberías | - IMPORTANTE para el uso con tasker, si la consulta devuelve más de una fila muy recomendable añadir lo siguiente después de la última comilla: |awk '{printf("%s%v_char_separacion",$0)}' por ej, sqlite3 ...ruta bd y archivo... "SELECT .... FROM ... WHERE ... " |awk '{printf("%s%v_charsplit",$0)}' Esto hace que cada fila esté separada por el caracter que queramos (%v_charsplit). Yo normalmente uso alguno raro, como el símbolo del yen o del estilo, algo que creas que no va a aparecer en el texto ni de casualidad. - Muy útil cuando hay muchos datos. Podemos usar la cláusula LIMIT al final (antes del awk, dado que este no forma parte de la consulta sql sql). Un ...WHERE habitantes>100 AND habitantes<1000 ORDER BY nom_población DESC LIMIT 10 nos dará los 10 primeros resultados con esa condición. - Como condiciónes están las típicas, >=, =, etc..., pero también LIKE, para comparar texto. La utilidad es que permite ignorar mayúsculas, minúsculas y usar comodines. Un ... WHERE nom_poblacion LIKE 'b%' devuelve los nombres de poblaciones que empiecen por b. - También muy útil y usando LIMIT: podemos hacer que nos muestre los 100 primeros resultados a partir del resultado número 500. ¿Para que sirve esto?, pués para usar paginación de modo que la consulta sea más rápida y sin variar las condiciones de búsqueda, ya que solo cambiamos que filas son devueltas. Podemos usar un LIMIT %v_offset,20, asumiendo que entran 20 resultados en pantalla. Por ej, en tasker: - Pongamos %num_pagina vale 3 - Pulsas botón de siguiente página -> asignas %num_pagina a %num_pagina+1 - Asignas %v_offset a %num_pagina*20 - ... LIMIT %v_offset,20 (te mostraría 20 filas a partir del 80º resultado) , y de este modo ir cambiando de página en página cambiendo el número de página. Y naturalmente, podrías añadir un cuadro de texto en la escena para indicar por qué campo quieres ordenar, o que columnas quieres ocultar, o qué rango de valores quieres para una columna determinada. Recoger esas condiciones en una variable de tasker e insertarla luego en la consulta. Para una tabla simple se reduce a la configuración inicial y la interacción con Tasker. Realmente la complicación se encuentra sobre todo cuando se trata de optimizar rendimiento en bases de datos muy pesadas y con muchas tablas y/o consultas muy complejas pero para archivos pequeños con tablas sueltas no relacionadas directamente entre sí no hace falta mirar practicamente nada. Salvo alguna duda puntual, más allá que lo que he puesto ya sería mirarse algún tutorial de SQLITE. Dado que en tu caso acostumbras a manejar datos importados de excel creo que podrás aprovechar muy bien las capacidades que ofrece un lenguaje como SQLITE, mucho más sencillo que javascript pero especializado en manejar datos. Última edición por danko9696 Día 08/03/16 a las 16:31:19. |
Los siguientes 5 usuarios han agradecido a danko9696 su comentario: | ||
#7
|
||||
|
||||
Muchas gracias. Más tarde voy a leermelo despacio.
Poco a poco iremos aprendiendo divirtiéndonos, que es como se aprende más!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
#8
|
||||
|
||||
Antes de nada, antes de escribir una sola linea de código, si eres root coge el Sqlite Debugger, abre la base de datos de whatsapp y prueba a trastear consultas en la tabla de messages, así podrás hacerte una idea de lo que puedes hacer luego en tasker con una db propia, sobre todo porque con esa app ni siquiera necesitas escribir nada para construirlas. Las más simples, claro, pero no por ello menos útiles.
|
Los siguientes 3 usuarios han agradecido a danko9696 su comentario: | ||
#9
|
||||
|
||||
Gracias @danko9696, veo que dominas el tema...
Ya me he metido y tengo un par de consultas referentes a Sqlite que postearé en el hilo de comandos de consola ya que se aparta mucho de la idea de este Tutorial (lo califico de Básico) Saludos!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
Gracias de parte de: | ||
#10
|
||||
|
||||
Ayer estaba preparando un texto para replicar aquí del modo siguiente:
Ese texto que escribí ayer era más largo, añadiendo otros detalles sobre la misma duda de los párrafos. Incluso miré la ayuda, la documentación de la app: ![]() Leer línea / Leer párrafo
Lee un registro (línea o párrafo) de un archivo de texto. 'Nº Línea/Párrafo' es número de registro a leer. Si no se especifica, se leerá el registro siguiente al leído *en ese mismo archivo*. Se usa una variable en lugar de un número para permitir, p.ej. leer un registro al azar vía la acción 'Variable Aleatoria'. Si se llega al final del archivo antes de encontrar el número de registro especificado, contendrá el valor EOF. El número siguiente de línea se reseteará a 1. Se ignorarán siempre líneas en blanco y cualquier carácter de nueva línea al final de un archivo. ![]() El caso es que en el último momento se me ocurrió que tal vez el código estuviera bien, que quizá el malentendido esté en el nombre de la acción LEER PÁRRAFO. Así pues hice la prueba: preparé un pequeño fichero de texto con tres líneas/párrafos: Código:
uno dos tres cuatro cinco seis siete ocho nueve 1. LEER PÁRRAFO 1 y guardar la info en una variable. 2. Usar un PopUp para mostrar el contenido de la variable. Comprobé que la acción LEER PÁRRAFO 1 leía todo el archivo de una sola vez. Otro detalle: aunque mi archivo tenía tres párrafos, la acción LEER PÁRRAFO 2 (para leer el párrafo segundo) daba el típico error EOF (End Of File, fin de fichero), error que se produce cuando se intenta leer un número de párrafo que no existe en ese fichero. Cace ofrece una pista sobre una aportación de WillyWeb al respecto. Busco y encuentro el mensaje enlazado a continuación (y los siguientes sobre el mismo tema) http://www.htcmania.com/showthread.p...6#post22054076 Ahí dice Willy que la acción Leer PARRAFO considera que el párrafo se acaba cuando hay una línea en blanco (una interlínea vacía) "o un código de fin de línea" (SIC). Pruebo Código:
uno dos tres cuatro cinco seis siete ocho nueve Las conclusiones son evidentes, aunque a mí me sigue pareciendo que la terminología resulta confusa y la documentación no aclara estos detalles que son importantes. Willy, ¿Puedes explicar eso del código de fin de línea? Normalmente yo interpretaría que esa expresión hace referencia al cambio de línea ("/n"), pero ya hemos visto que la acción LEER PÁRRAFO no lo tiene en cuenta. ¿?
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
Gracias de parte de: | ||
#11
|
||||
|
||||
Yo, después del tiempo que pasé buscando el error en el código JS, cuando vi que la solución era usar la opción "Leer Párrafo" en lugar de la acción "Leer Archivo" (como venia haciendo resolviéndolo en Tasker puro) ya no me preocupé más. Es así y punto. Desde aquel dia he estado adaptando mis programas para incorporar JS en todos los bucles FOR que trataban muchos datos y "mano de santo, oiga..." Y para manejar las bases de datos: Sqlite (a nivel elemental) y esto vuela! Saludos a todos
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 27/03/16 a las 11:34:22. |
Gracias de parte de: | ||
#12
|
||||
|
||||
![]() Y lo de usar "leer párrafo" en vez de "leer archivo" es una "solución" al error que se produce si usas JavaScript en la misma tarea. Si la tarea no usa JS no tiene utilidad.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
Gracias de parte de: | ||
#13
|
||||
|
||||
Muy buen tutorial
Enviado desde mi SM-G900F |
Gracias de parte de: | ||
#14
|
||||
|
||||
He probado con 700 filas y 13 columnas y peta. Alguna solución?
Enviado desde mi SM-G900F |
#15
|
||||
|
||||
Y sí, hay solución, se llama Sqlite3 y si has leido todo el post verás que su uso es determinante, no hay color.... No obstante deberás tener el móvil rooteado e instalar el intérprete de comandos. Para ello mirate este post del compañero @mlesir: http://www.htcmania.com/showthread.php?t=771950 Mírate los aportes de @danko9696 y lo que se ha posteado recientemente en el hilo de referencia y en este que te pongo, todos relativos a Sqlite3: http://www.htcmania.com/showthread.php?t=1146595 La velocidad de ejecución de las consultas a bases de datos relativamente grandes (alrededor de 1000 filas y 10 o 12 columnas) es asombrosa (al menos para mí), y para un uso a nivel elemental es bastante sencillo. Puedes, con una sola acción de código, buscar todos los campos (de las columnas que quieras) que contengan determinados caracteres, un valor mayor, menor o igual que un valor determinado, etc. y que te ordene los datos encontrados como quieras. La salida de la acción es una variable que contiene todos los datos que cumplen las condiciones impuestas. En cuanto le coges el gusto a esta combinación de JavaScript y Sqlite3 verás que se te empiezan a ocurrir nuevas aplicaciones!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
Gracias de parte de: | ||
#16
|
||||
|
||||
Muchas gracias por la respuesta. Lo miraré
Enviado desde mi SM-G900F |
#17
|
||||
|
||||
Aparte. ¿Podrías pasar los datos de sqlite como hiciste en el ejemplo de los pueblos? Gracias
|
#18
|
||||
|
||||
Además no creo que sea yo, un novato, el más adecuado para hacer un tutorial de Sqlite. A ver si alguno de los que lo controlan más se anima y abre un hilo específico para la integración de Sqlite en Tasker. De momento, y sólo para que no te quedes en ascuas, te explico sencillamente como lo he hecho yo: Partimos de que tenemos nuestros datos en una tabla de F filas y C columnas hecha en Excel y guardada en formato .csv Tenemos instalado en el móvil el intérprete de Sqlite3 según las indicaciones y referencias que te dí en posts anteriores. Instalamos un complemento de Mozila Firefox que se llama Sqlite Manager (hay otros, pero yo uso este...) y al que se accede, una vez instalado, desde la pestaña "Herramientas" del navegador. CREACIÓN DE LA BASE DE DATOS - Lo primero que hago es abrir el arxivo Pobles.csv (para mantener la nomenclatura del ejemplo) con Microsoft Word y guardarlo como un archivo de texto con el nombre Pobles-UTF8.csv eligiendo para ello en el cuadro "Otra codificación" la opción "Unicode-UTF8". Igual que lo haciamos anteriormente pero, fíjate bién, ahora le fuerzo la extensión a .csv en lugar de aceptar la .txt que sale por defecto. Esto es así porque para crear la base de datos necesitaremos que el archivo tenga esta extensión y por esto he añadido "-UTF8" al nombre para distinguirlo del original. - Creamos nuestra base de datos con Sqlite Manager y a la que, siguiendo el ejemplo, llamo CAT_2016.db (aunque por defecto la extensión que proporciona el programa es .sqlite). Una explicación previa: una base de datos puede tener varias tablas que puedes usar y cuyos datos se encuentran de alguna manera relacionados. - Creamos una tabla con el nombre Municipis y se nos abre una pestaña en la que declaramos los nombres y tipos de datos de las columnas: POBLACIO,C_POSTAL,COMARCA,PROVINCIA,DOMICILI,TELEF ON,HABITANTS,SUPERFICIE,ALTURA,WEB,GENTILICI. Todos los campos de texto (TEXT) menos los habitantes, superfície y altura sobre el nivel del mar que los definiré como enteros (INTEGRER). - Importamos los datos de nuestro Pobles-UTF8.csv dándole al icono de la flecha azul y seleccionando el nombre del archivo que contiene los datos (fíjate que nos pide, por defecto, un .csv) a importar y escribiendo en la pestaña correspondiente el nombre de la tabla donde irán a parar. También deberemos especificar si la tabla original tiene cabecera (nombre de las columnas) y cual és el separador de columnas (; en nuestro caso). Le damos al botón del final y nos importa los datos. USO DE LA TABLA EN TASKER - Partimos de que tenemos una escena con un elemento menú central que nos muestra el contenido de la matriz %poblacio - Extraemos los nombres de las poblaciones (sólo los nombres, de momento) mediante la consulta escrita con una acción Ejecutar consola del grupo Código con el siguiente comando: sqlite3 /sdcard/BDades/CAT_2016.db "SELECT POBLACIO FROM Municipis" Almacenar salida en: %població Interpretación del comando: Le pedimos al sistema que se ejecute el intérprete sqlite3 sobre la base de datos que está en /sdcard/BDades cuyo nombre es CAT_2016.db con el comando: Selecciona todos los datos de la columna POBLACIO de la tabla Municipis.... y guárdalos en la variable %població. - Ya tenemos la variable, ahora la descomponemos para generar la matriz. Puedes hacerlo es JS o desde Tasker creando una variable %newline que no contiene más que un "return" (salto de línea) y luego, Separar variable: %població Separar con: %newline. - Ahora ya puedes mostrar la escena con la lista completa de los pueblos. - Al clicar sobre el nombre de un pueblo en la escena una nueva llamada a Sqlite te saca los datos de cada población con el siguiente comando: sqlite3 /sdcard/BDades/CAT_2016.db "SELECT * FROM Municipis WHERE POBLACIO = '%tap_label'" Almacenar salida en %dades Interpretación del comando: Le pedimos al sistema que se ejecute el intérprete sqlite3 sobre la base de datos que está en /sdcard/BDades cuyo nombre es CAT_2016.db con el comando: Selecciona todos los datos de la tabla Municipis donde la columna POBLACIO coincide con la etiqueta que he pulsado en el elemento menú de la escena... y guárdalos en la variable %dades. - Como antes el resultado és una variable que contiene todos los datos de la fila correspondiente a la población elegida. Ahora deberemos separar sus valores mediante "|" (sqlite encadena los diferentes datos de una fila con el simbolo | o "tubo") y obtendremos los valores: %dades1, %dades2,...%dades11 en nuestro caso. Definimos las variables que será calculadas: %densitat = %dades7/%dades8 Calcular: activado (tendrás la densidad en Hab/km2 en una nueva variable) y ya podemos mostrar la escena Fitxa Pobles. MEJORAS Y COMPLEMENTOS 1.- He añadido un campo de texto editable en la escena en el que introduciendo un texto (3 o 4 caracteres) puedo realizar una búsqueda en la BD de las poblaciones que contienen (en cualquier posición) estos 3 o más caracteres. Al lado del texto editable hay un botón que ejecuta el comando. Aquí una muestra de como quedan las escenas Como hago la búsqueda en Sqlite3? Atendiendo a que el valor de %new_val en la pestaña: Texto cambiado del elemento Editar texto lo llamo %buscar_poble utilizo el siguiente comando de fácil comprensión: sqlite3 /sdcard/BDades/CAT_2016.db "SELECT POBLACIÓ FROM Municipis WHERE POBLACIO LIKE '%%buscar_poble%'" Almacenar salida en: %poblacio Observad que he añadido % al principio y al final del nombre de la variable. Esto es así para que me encuentre la cadena tecleada en la ventana de texto esté en la posición que esté. Si sólo buscara poblaciones que empezaran con estos caracteres eliminaria el primer % 2.- Un elemento "Rueda" desplegable en misma la escena me muestra los nombres de todas las comarcas. Clicando en uno de ellos se ejecuta el sigüiente comando que me muestra los nombres de las poblaciones de la comarca elegida: sqlite3 /sdcard/BDades/CAT_2016.db "SELECT POBLACIÓ FROM Municipis WHERE COMARCA ='%tap_label'" Almacenar salida en: %poblacio Una observación: para que me muestre en el elemento Rueda los nombres de las comarcas he preparado antes, en la definicion de variables de la tarea principal, una variable %comarca que contine los nombres de todas las comarcas separadas por ";" y fabricado la matriz %comarca con un Separar variable por ";"... 3.- Lo mismo para Provincias, etc, etc... Ya veis que se abre, al menos a mí se me abrió, un mundo nuevo en Tasker...
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 21/04/16 a las 13:03:55. |
Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
#19
|
||||
|
||||
Muchas gracias por la información. Lo probaré. Con los datos que diste en el tutorial de primer post he aprendido mucho el funcionamiento de tasker y las escenas que andaba yo muy perdido. He conseguido exportarlo a un app y va de lujo pero claro con pocos datos. En cuanto pongo más datos de la cuenta peta.
De momento la solución ha sido dividir el programa en 4 bloques de 200 filas. Y crear una escena nueva que llama a cada 1 de los bloques. Más fácil de buscar, más rápido de procesar y no peta jejeje. Enviado desde mi SM-G900F |
Gracias de parte de: | ||
|
#20
|
||||
|
||||
No lo dudes, usa Sqlite3 de la manera que te indico y no volverás a convertir tus proyectos en apps con el Factory. La velocidad y flexibilidad de uso que consigues és alucinante comparada con la de Tasker puro. Y los bucles que procesan muchos datos con JS…!
En cuanto a lo de tener varias tablas en la misma BD és otra posibilidad muy potente ya que puedes buscar la salida de un comando con otro comando en otra tabla. (Mírate el post-consulta que puse días atras de integración de Barcode Scaner en Tasker para mi proyecto de gestión de una base de datos de plantas…) Enviat des del meu SM-T550 usant Tapatalk
__________________
Me apasiona volar, pero con los pies en el suelo...
|
Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
![]() |
![]() |
||||||
|