|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#41
|
||||
|
||||
|
He estado investigando un poco y parece que se puede hacer con awk, pero yo desde luego no lo he conseguido hacer funcionar...
Personalmente estoy siempre más comodo con Javascript, así que yo descartaría el awk (que va muy bien para hacer todo de golpe cuando quieres algo simple, pero en este caso se complica) y haría algo así, suponiendo que el resultado de ejecutar la SELECT la guardes en %resultado: Código:
var lineas = resultado.split("\n");
resultado = "";
for(i in lineas) {
campos = lineas[i].split("|");
resultado += campos[0] + ' - ' + (parseInt(campos[1], 10).toLocaleString()) + "\n";
}
- Borro resultado y lo iré sobreescribiendo para que al final del codigo %resultado tenga el valor esperado sin crear más variables nuevas. - Recorro las lineas (uso el formato de "for" alternativo, se podría usar el típico for(var i = 0; i < lineas.length; i++) pero para estos casos así lo veo más claro) - Separo los campos por la tubería y queda un array con el valor de POBLACIO en la posición 0 y el de HABITANTS en 1 - Genero la linea concatenando la información ![]() Lo he estado probando y no funciona. Explico que he hecho: He escrito en una acción JavaScriplet lo que me sugieres y no hace nada.... ![]() Entonces he ido poniendo sentencias flash(var_loquesea) a cada paso obteniendo resultados positivos hasta que ha fallado... devuelve el resultado de la variable campos pero ya no compone el primer resultado (resultado[0]) con la separación por millares... ¿Puede ser que no tenga implementadas las funciones "parseInt" y "toLocaleString" en JavaScript? Lo tengo escrito exactamente así: Código:
var lineas = (poblacio.split("\n"));
poblacio = "";
for(i in lineas)
{
camps = lineas[i].split("|");
flash(camps[0] + "---" + camps[1]);
poblacio += camps[0] + ' - ' + (parseInt(camps[1], 10).toLocaleString()) + "#";
}
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 14/03/16 a las 15:46:08. |
| Gracias de parte de: | ||
|
|
|
#42
|
||||
|
||||
|
Hola de nuevo, sigo traskeando y tengo una pequeña cuestión sobre sqlite3:
¿Como se puede reemplazar el carácter separador "|" cuando se me muestra el resultado de una extracción por dos columnas de una base de datos en Sqlite? Lo he intentado en Tasker, antes y después de separar los datos, con buscar y reemplazar sobre la variable de salida pero sin resultado… También he probado el comando .separator " - " , dentro de la acción sqlite, pero nada… El problema es que hago una consulta de Poblaciones y Habitantes ordenada por el n° habitantes y la salida se me muestra p.e. así: "Arenys de Mar|14657" cuando preferiria un resultado como "Arenys de Mar - 14.657" EDITO: Parcialmente solucionado "interpretando" una acción que copié letra a letra de un post para hacer consultas en la agenda… sqlite3 /sdcard/BDades/CAT_2016.db "SELECT POBLACIO, HABITANTS FROM Municipis WHERE COMARCA = '%triat' OR PROVINCIA = '%triat' ORDER BY HABITANTS DESC " | awk -F "|" '{print $1" -",$2}' Falta sólo formatear $2 con separación de miles… Enviat des del meu SM-T550 usant Tapatalk ![]() SELECT pob || ' - ' || hab as campo1 FROM .... Para formatear el número probablemente se pueda con sqlite en la propia consulta, usando CASE...WHEN... |
| Los siguientes 2 usuarios han agradecido a danko9696 su comentario: | ||
|
#43
|
||||
|
||||
|
En cuanto a lo del formateo del nº de habitantes he estado googleando y, al parecer, no es posible con comandos dentro de Sqlite3. Habrá que seguir investigando a ver si con AWK puede resolverse porque no me ha funcionado con sentencias JS tal como apuntaba el compañero maid450... (ten en cuenta que hasta hace pocos dias no me habia metido con JS y estoy madurando paso a paso a través de este proyecto de prácticas)
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#44
|
||||
|
||||
|
Buenas, primero que nada pienso que igual lo más correcto sería abrir un hilo para este tema, ya que al fin y al cabo eso era una recopilación de comandos de shell y se está yendo de las manos
.Dicho esto (y si eso lo abres y ya seguimos allí) que no tengas las funciones me extraña, pero es fácil de comprobar, haz una tarea nueva con sólo un js que haga Código:
flash(parseInt(1234567, 10).toLocaleString()); Si es así (que es lo más probable) el fallo está en lo que se le está pasando al parseInt: camps[1] que no tendrá el número a pelo que es lo que hay que pasarle. De los 2 problemas, el separar por un guión y el poner el punto de los millares, el primero en efecto tiene varias soluciones y todas correctas: en la propia query como apunta danko, con awk en el shell o con js (y seguro que hay más). Si ahí acabara todo me decantaría por la primera, porque es la más óptima y más limpia, pero para el segundo punto, por lo que he visto no parece que haya otra forma más que con js, y para ello hay que trocear la respuesta, formatear el número, y recomponerla, y por eso creo que es mejor dejar la query con el select a pelo devolviendo los 2 campos separados por tuberías, porque si no tienes a sqlite componiendo un resultado que js va a trocear completamente y recomponerlo otra vez, con lo que se hace un paso para deshacerlo después. No sé si me he explicado bien... jeje Dicho esto, cace, después de comprobar si tienes las funciones con el código que he puesto antes necesito que pongas de nuevo el script que has hecho, pero con "flashes" a cada paso y que indiques en cada paso del script el valor de cada variable (un ejemplo del formato al menos) a ver si vemos qué falla. Y si no tienes las funciones pues tendremos que hacer el pino-puente, pero algo sacaremos 😛 Enviado desde mi Nexus 5 mediante Tapatalk |
| Los siguientes 2 usuarios han agradecido a maid450 su comentario: | ||
|
#45
|
||||
|
||||
|
Sí, lo suyo seria quizás un hilo específico para SQLITE o uno para este caso concreto porque se está desviando un poco, no se si los admin podrán mover posts de un hilo a otro.
Respecto al formateo vuelvo a comentar que pienso que se debería poder hacer en sqlite usando CASE WHEN THEN, usando como condiciones <=999, >=1000 AND <999999 y >=1000000, troceando/recomponiendo con tuberías y SUBSTR. La consulta quedaría algo más extensa y difícil de ver pero una vez hecho queda todo en ella. Con un poco de paciencia no debería ser muy complicado. Lo haría yo mismo pero ahora estoy con otra cosa algo más liosa y no quiero perder el hilo. |
| Gracias de parte de: | ||
|
#46
|
||||
|
||||
|
Hola de nuevo @maid450 y gracias por colaborar tan eficazmente a resolver estos "problemillas" que estoy teniendo...
Cita: .... pero es fácil de comprobar, haz una tarea nueva con sólo un js que haga
Código:
flash(parseInt(1234567, 10).toLocaleString()); ![]() De hecho habia estado casi toda la tarde haciendole perrerias y me dije: "Vamos a reiniciar no sea que..." Reinicio total "et voilà" funcionó!!!. ![]() Cita:Si es así (que es lo más probable) el fallo está en lo que se le está pasando al parseInt: camps[1] que no tendrá el número a pelo que es lo que hay que pasarle.
De los 2 problemas, el separar por un guión y el poner el punto de los millares, el primero en efecto tiene varias soluciones y todas correctas: en la propia query como apunta danko, con awk en el shell o con js (y seguro que hay más). Si ahí acabara todo me decantaría por la primera, porque es la más óptima y más limpia, pero para el segundo punto, por lo que he visto no parece que haya otra forma más que con js, y para ello hay que trocear la respuesta, formatear el número, y recomponerla, y por eso creo que es mejor dejar la query con el select a pelo devolviendo los 2 campos separados por tuberías, porque si no tienes a sqlite componiendo un resultado que js va a trocear completamente y recomponerlo otra vez, con lo que se hace un paso para deshacerlo después. No sé si me he explicado bien... jeje ![]() Cita: Dicho esto, cace, después de comprobar si tienes las funciones con el código que he puesto antes necesito que pongas de nuevo el script que has hecho, pero con "flashes" a cada paso y que indiques en cada paso del script el valor de cada variable (un ejemplo del formato al menos) a ver si vemos qué falla.
Y si no tienes las funciones pues tendremos que hacer el pino-puente, pero algo sacaremos ![]() Sólo falta pulir lo que comentas de meter "flashes" a cada línea para encontrar la que falla.... Muchas gracias de nuevo y saludos a todos. PD: en el PC el código en JS que pusiste con el "splitado" de la variable "resultado" en tu post aparece mal formateado y no es correcto...
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#47
|
||||
|
||||
|
Ys está, perfecto @maid450!, ha funcionado a la primera
![]() ![]() ![]() La consulta Sqlite con variable de salida %poblacio. Código:
sqlite3 /sdcard/BDades/CAT_2016.db "SELECT POBLACIO,HABITANTS FROM Municipis WHERE COMARCA = '%triat' OR PROVINCIA = '%triat' ORDER BY HABITANTS DESC " Código:
var lineas = poblacio.split( "\n" ); //aqui se acaba la primera linea
poblacio = "";
for (i in lineas)
{
camps = lineas[i].split("|");
poblacio += camps[0] + " - " + (parseInt(camps[1], 10).toLocaleString()) + "|";
}
Un millón (1.000.000) de gracias!
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 15/03/16 a las 12:33:57. Razón: Editado de nuevo porque, como denuncié antes, el código JS aparecia mal formateado |
| Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
|
#48
|
||||
|
||||
|
Le he estado dando algo más de caña a sqlite. Estaba casi seguro de que debía funcionar y así es. He hecho alguna cosa parecida a lo que haría falta para este caso, que sería más o menos:
CASE WHEN habitantes<999 THEN habitantes WHEN habitantes >999 AND habitantes<=999999 THEN SUBSTR(habitantes,1,LENGTH(habitantes)-3) || '.' || SUBSTR(habitantes,LENGTH(habitantes)-3+1,3) WHEN habitantes >999999 THEN .... <lo mismo, jugar con SUBSTR y demas> . . END AS habitantesformateado Aparatoso pero una vez hecho queda todo encapsulado en la consulta y más rápido si tienes que repetir el proceso muchas veces. |
| Los siguientes 3 usuarios han agradecido a danko9696 su comentario: | ||
|
#49
|
||||
|
||||
|
Le he estado dando algo más de caña a sqlite. Estaba casi seguro de que debía funcionar y así es. He hecho alguna cosa parecida a lo que haría falta para este caso, que sería más o menos:
CASE WHEN habitantes<999 THEN habitantes WHEN habitantes >999 AND habitantes<=999999 THEN SUBSTR(habitantes,1,LENGTH(habitantes)-3) || '.' || SUBSTR(habitantes,LENGTH(habitantes)-3+1,3) WHEN habitantes >999999 THEN .... <lo mismo, jugar con SUBSTR y demas> . . END AS habitantesformateado Aparatoso pero una vez hecho queda todo encapsulado en la consulta y más rápido si tienes que repetir el proceso muchas veces. ![]() Estoy subscrito a este hilo y lo sigo a diario. Probaré en la próxima el método que sugieres. En realidad ya habia intentado el método de fragmentar la cadena incial por grupos de 3 cifras insertando los puntos en JS, pero no me acababa de funcionar por algún error de sintaxis (estoy en 1º aún...) De momento lo he resuelto como describo en el post #47 de este mismo hilo. Lo que hago en el programa definitivo son dos consultas con Sqlite siempre que elijo con un botón uno de los criterios de búsqueda: Lista global, Lista por la Provincia elegida en un desplegable Rueda, Lista por la Comarca elegida en otro desplegable Rueda, Lista por nombre elegido en un campo de texto editable. - Primera consulta por POBLACIO ordenada ASC y guardada en %població - Segunda consulta por POBLACIO,HABITANTS ordenada por HABITANTS DESC y guardada en %habitants Luego separo la variable %poblacio y "redibujo" la escena. Si le doy al boton de Ordenar por habitantes una primera vez, guarda %poblacio en una variable %temporal y establezco como %poblacio lo que contiene %habitants (es decir la lista de pares POBLACIO - HABITANTS ordenada por nº de habitantes) para el conjunto de poblaciones que se muestra en pantalla de acuerdo con los filtros que se hayan puesto. Se ejecuta el JS que descompone y formatea los resultados y se muestra la escena otra vez. Si de doy al botón Ordenar por habitantes una segunda vez se comporta como un commutador: pone en %poblacio lo que antes habia guardado en %temporal (es decir la lista que contiene sólo los nombres) separa la variable y muestra de nuevo la escena. ![]() El resultado és muy eficiente: para mostrar la lista completa de la base de datos (948 poblaciones) ordenada por población está entre 0,79 y 1,12 seg. un rayo, vamos! Y pensar que, en Tasker puro tardaba 12 seg para mostrar la lista reducida de 500 poblaciones! Tenia incluso una pantalla de espera tranquilizadora para que me contara lo que estaba haciendo... que ahora, evidentemente, he suprimido.
__________________
Me apasiona volar, pero con los pies en el suelo...
|
|
#50
|
||||
|
||||
|
El resultado és muy eficiente: para mostrar la lista completa de la base de datos (948 poblaciones) ordenada por población está entre 0,79 y 1,12 seg. un rayo, vamos!
Y pensar que, en Tasker puro tardaba 12 seg para mostrar la lista reducida de 500 poblaciones! Tenia incluso una pantalla de espera tranquilizadora para que me contara lo que estaba haciendo... que ahora, evidentemente, he suprimido. ![]() |
| Los siguientes 2 usuarios han agradecido a danko9696 su comentario: | ||
|
#51
|
||||
|
||||
|
Hola de nuevo,
Estoy haciéndome una aplicación para la navegación en coche que utiliza una base de datos hecha a partir de la lista de radares de puntodeinteres.com Pretendo obtener con Sqlite la lista de radares que cumplen simultaneamente 4 condiciones: Longitud entre %x_min , %x_max Latitud entre %y_min , %y_max He probado de ampliar el rango de búsqueda pero no me funciona… Lo tengo escrito así: sqlite3 /sdcard/BDades/RADARS.db "SELECT * FROM SITUACIO WHERE LONGITUD BETWEEN '%x_min' AND '%x_max' AND LATITUD BETWEEN '%y_min' AND '%y_max' " He probado también de encadenar las cuatro condiciones AND sin los BETWEEN pero tampoco… Alguien me echa una manita? Gracias! Enviat des del meu SM-T550 usant Tapatalk
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#52
|
||||
|
||||
|
Hola de nuevo,
Estoy haciéndome una aplicación para la navegación en coche que utiliza una base de datos hecha a partir de la lista de radares de puntodeinteres.com Pretendo obtener con Sqlite la lista de radares que cumplen simultaneamente 4 condiciones: Longitud entre %x_min , %x_max Latitud entre %y_min , %y_max He probado de ampliar el rango de búsqueda pero no me funciona… Lo tengo escrito así: sqlite3 /sdcard/BDades/RADARS.db "SELECT * FROM SITUACIO WHERE LONGITUD BETWEEN '%x_min' AND '%x_max' AND LATITUD BETWEEN '%y_min' AND '%y_max' " He probado también de encadenar las cuatro condiciones AND sin los BETWEEN pero tampoco… Alguien me echa una manita? Gracias! Enviat des del meu SM-T550 usant Tapatalk ![]() Sin más info a priori parece cosa de que el formato de los datos que envías es distinto de como están en la base de datos, suponiendo que estos sean correctos (¿punto decimal?). |
| Gracias de parte de: | ||
|
#53
|
||||
|
||||
|
¿Has probado la consulta en una aplicación aparte que no sea Tasker (eso debería ser lo primero)? ¿Has probado con solo tres parámetros (dos, uno, ninguno)?.
Sin más info a priori parece cosa de que el formato de los datos que envías es distinto de como están en la base de datos, suponiendo que estos sean correctos (¿punto decimal?). ![]() El punto es el punto para permitirme operaciones matematicas y las columnas de la tabla que no necesitaba las eliminé. Las consultas con SQLite debugger como he comprobado funcionan, y los campos de coordenadas los definí como de coma flotante… Voy a hacer un repaso minucioso de la tarea a ver que pasa. Es que tenia dudas acerca de la sintaxis adecuada del filtro BETWEEN. En cuanto lo pueda resolver lo notificaré. Si al final va a resultar que es cualquier chorrada… Enviat des del meu SM-T550 usant Tapatalk
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#54
|
||||
|
||||
|
lo mejor para depurar es que pongas una acción "copiar en el portapapeles" que copie el comando que finalmente se va a ejecutar con el reemplazo de variables hecho por Tasker y tal, y coges y lo ejecutas tal cual en un terminal o te quedas con la query en si y la ejecutas en el SQLite debugger
|
| Gracias de parte de: | ||
|
#55
|
||||
|
||||
|
lo mejor para depurar es que pongas una acción "copiar en el portapapeles" que copie el comando que finalmente se va a ejecutar con el reemplazo de variables hecho por Tasker y tal, y coges y lo ejecutas tal cual en un terminal o te quedas con la query en si y la ejecutas en el SQLite debugger
![]() |
|
#56
|
||||
|
||||
|
Ya está, y al final era una chorrada:
Resulta que la salida de Tasker para las variables %LOCN y %LOC és en la forma LATITUD, LONGITUD. en cambio la lista de coordenadas de la base de radares de puntodeinteres.com tiene el formato LONGITUD, LATITUD, TIPO, VELOCIDAD.... La consulta en Sqlite estaba bién, incluso he añadido después un BETWEEN para el ángulo (para que me coja sólo los del sentido en el que circulo). El problema real era que buscaba radares de España en medio del Atlántico, a 340 Km de la desembocadura del Amazonas... Con razón la variable de salida de la consulta estaba siempre vacia aunque ampliara el radio de búsqueda a 100 km.! Muchas gracias y saludos!
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 31/03/16 a las 20:17:35. |
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||