Page 1 sur 1

Séparer et isoler une chaîne en lua

Publié : 14 nov. 2017, 23:39
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:

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

Publié : 15 nov. 2017, 00:20
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.

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

Publié : 15 nov. 2017, 12:37
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 ?

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

Publié : 15 nov. 2017, 15:06
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.

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

Publié : 15 nov. 2017, 21:54
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.