Séparer et isoler une chaîne en lua

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
FafaDomo
Messages : 46
Inscription : 23 oct. 2015, 10:04

Séparer et isoler une chaîne en lua

Message par FafaDomo »

Bonjour,

Je cherche comment séparer les lignes et isoler les valeurs correspondants aux libellés dans une chaîne de ce type (avec des retours à la ligne):
  • battery.charge: 100
    battery.runtime: 2848
    ups.load: 13
    ups.status: OL
Je veux mettre dans une variable Charge la valeur 100, dans une variable Runtime, la valeur 2848, etc...

La fonction split n'existe pas en Lua... Avec string.gmatch je suppose mais je ne comprends pas la syntaxe à utiliser. :roll:
Domoticz V3.8153 sur Nas Synology DS413
cyberbob
Messages : 511
Inscription : 28 nov. 2016, 19:43
Localisation : Belgique

Re: Séparer et isoler une chaîne en lua

Message par cyberbob »

regarde toujours ici : https://easydomoticz.com/forum/viewtopic.php?f=7&t=4765
c'est un script qui récupère les valeurs d'une station et les places dans des variables.
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
FafaDomo
Messages : 46
Inscription : 23 oct. 2015, 10:04

Re: Séparer et isoler une chaîne en lua

Message par FafaDomo »

Cool, merci pour les infos ! :)
Par contre j'ai toujours le problème pour séparer les lignes...
Ma variable contient 42 lignes ! Et en faisant:

Code : Tout sélectionner

local v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42 = result:match("([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)\n([^;]+)")
Si, si, je l'ai fait !! :shock:

Domoticz renvoie un timeout > 10 secondes.
Lorsque je fais l'essai sur quelques lignes ça fonctionne, donc le code est bon mais trop long à s'exécuter.

Quelqu'un connaît peut-être une façon plus rapide ou plus simple ?
Domoticz V3.8153 sur Nas Synology DS413
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Séparer et isoler une chaîne en lua

Message par Neutrino »

Salut !
J'utilise ça :

Code : Tout sélectionner

local function split(s, delimiter)
	local result = {}
	for match in (s..delimiter):gmatch('(.-)'..delimiter) do
		table.insert(result, match)
	end
	return result
end
s est la chaîne à découper et delimiter est le caractère qui sépare tes variables.
ça retourne un tableau avec toutes tes variables.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
FafaDomo
Messages : 46
Inscription : 23 oct. 2015, 10:04

Re: Séparer et isoler une chaîne en lua

Message par FafaDomo »

Merci, c'est plus propre.
Mais il y a toujours le problème de retour à la ligne...

J'ai concocté ça entre temps:

Code : Tout sélectionner

local function recherche(chaine, texte, delimiter)
	local s1 = string.find(chaine, texte) + string.len(texte)
	local s2 = string.find(chaine, delimiter, s1) - string.len(delimiter)
	return string.sub(chaine, s1, s2)
end
Avec un appel à la fonction comme ça:

Code : Tout sélectionner

local Charge = recherche(result, "battery.charge: ", "\n")
où result est ma variable multi-lignes
ça fonctionne très bien comme ça, sauf pour la dernière ligne de la variable qui ne se termine pas par "\n", du coup s2 renvoie nil et donc -> erreur.
Domoticz V3.8153 sur Nas Synology DS413
Répondre