Ver Mensaje Individual
  #1  
Viejo 11/06/15, 21:54:25
Avatar de WillyWeb
WillyWeb WillyWeb no está en línea
Usuario muy activo
Mensajes: 2,067
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Versión de ROM: OxygenOS 9.0.6 | MIUI 12.5.1
Versión de Radio: Stock
Tu operador: Vodafone
Mencionado: 75 comentarios
Tagged: 3 hilos
Alternativa a "Separar variable" para sacar datos de un archivo de texto

Muy buenas a tod@s

Sigo repasando el recopilatorio en modo esponja y no paro de encontrar ideas realmente brillantes.

El listón está muy alto y no es nada fácil aportar ideas nuevas, pero he visto en más de un proyecto algo que yo hago de otra forma ... sacar información de un archivo de texto descargado (xml, html y cosas así).

En casi todos los proyectos se descarga el archivo con "HTTP Get", se pasa el contenido de la variable global %HTTPD a una local y se trocea esa variable con "Separar variable" para ir "entresacando" la parte que interesa. Indudablemente el sistema funciona, es cuestión de repetir la acción tantas veces como sea necesario para "acorralar" el trozo de información que se necesita.

No digo que siempre, pero la mayor parte de las veces eso se puede hacer más fácilmente usando una "expresión regular" en la acción "Buscar y Reemplazar".

Lo explico con un ejemplo...

Supongamos que quieres saber la dirección de una ubicación de GPS (para saber en qué calle has dejado aparcado el coche, por ejemplo). Para eso podemos recurrir al "Google Maps Geocoding API" y descargar un XML con la información requerida.

https://maps.googleapis.com/maps/api...6947,-3.703529

Código:
<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
 <status>OK</status>
 <result>
  <type>street_address</type>
  <formatted_address>Plaza Puerta del Sol, 11, 28013 Madrid, Madrid, España</formatted_address>
  <address_component>
   <long_name>11</long_name>
   <short_name>11</short_name>
   <type>street_number</type>
  </address_component>
  <address_component>
   <long_name>Plaza Puerta del Sol</long_name>
   <short_name>Plaza Puerta del Sol</short_name>
   <type>route</type>
  </address_component>

... y así más de 600 líneas.
Lo que nos interesa está entre las etiquetas <formatted_address>, y yo lo extraigo así...

Código:
A1: Buscar y Reemplazar Contenido de Variable [ Variable:%HTTPD Buscar:<formatted_address>.*?</formatted_address> Una sola coincidencia:Encendido Almacenar Coincidencias En:%httpd ]
A2: Buscar y Reemplazar Contenido de Variable [ Variable:%httpd1 Buscar:<.*?> Reemplazar Coincidencias:Encendido Reemplazar Con:nada ]
La primera acción saca de la variable %HTTPD (la variable de Tasker asociada a HTTP Get) todo lo que está entre las primeras etiquetas <formatted_address> que encuentre y lo deja en %httpd1.

La segunda acción elimina de %httpd1 todo lo que tenga el aspecto de una etiqueta.

Edito para añadir la excelente sugerencia de mlesir de usar look around asertions

Cambiando la expresión regular que he puesto en A1 por esta otra ...

(?<=<formatted_address>).*?(?=</formatted_address>)

... el resultado que buscamos es inmediato y no necesitamos A2, así que la cosa quedaría así ...

Código:
A1: Buscar y Reemplazar Contenido de Variable [ Variable:%httpd Buscar:(?<=<formatted_address>).*?(?=</formatted_address>) Una sola coincidencia:Encendido Almacenar Coincidencias En:%httpd ]
Y ahora sí. El resultado está en%httpd1 limpio de polvo y paja

Hasta la próxima ...

Última edición por WillyWeb Día 01/03/16 a las 16:31:09 Razón: Incluir la sugerencia de mlesir de usar "look around asertions"
Responder Con Cita
Los siguientes 3 usuarios han agradecido a WillyWeb su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]