2 votes

Lecture d'un fichier de colonnes de x y z dans un tableau en Lua

J'essaie de m'y retrouver dans Lua, j'ai donc un fichier contenant N lignes de nombres, 3 par ligne, ce sont en fait des coordonnées x,y,z. Je pourrais en faire un fichier CSV et utiliser un analyseur CSV de Lua, mais je pense qu'il vaut mieux que j'apprenne à le faire quand même.

Alors, quelle serait la meilleure façon de régler ce problème ? Jusqu'à présent, je suis capable de lire chaque ligne dans un tableau à l'aide de l'extrait de code ci-dessous, mais 1) je ne sais pas s'il s'agit d'un tableau de chaînes ou de chiffres, 2) si j'imprime tbllinesx[1], cela imprime la ligne entière de trois chiffres. Je voudrais pouvoir avoir tbllines[1][1], tbllines[1][2] et tbllines[1][3] correspondant aux 3 premiers numéros de la 1ère ligne de mon fichier.

local file = io.open("locations.txt")
local tbllinesx = {}
local i = 0
if file then
for line in file:lines() do
 i = i + 1
 tbllinesx[i] = line
end
file:close()
else
error('file not found')
end

3voto

Piglet Points 7662

De la programmation en Lua https://www.lua.org/pil/21.1.html

Vous pouvez appeler read avec plusieurs options ; pour chaque argument, la fonction retournera le résultat correspondant à chaque argument. Supposons que vous ayez un fichier avec trois numéros par ligne :

6.0 -3.23 15e12

4.3 234 1000001

... Maintenant, vous voulez imprimer le maximum de chaque ligne. Vous pouvez lire les trois nombres en un seul appel à read :

while true do
  local n1, n2, n3 = io.read("*number", "*number", "*number")
  if not n1 then break end
  print(math.max(n1, n2, n3))
end

En tout état de cause, vous devez toujours envisager l'alternative de lire les fichier entier avec l'option "*all" de io.read et ensuite utiliser gfind pour le découper :

local pat = "(%S+)%s+(%S+)%s+(%S+)%s+"
for n1, n2, n3 in string.gfind(io.read("*all"), pat) do
  print(math.max(n1, n2, n3))
end

Je suis sûr que vous pouvez trouver comment modifier cela pour mettre les chiffres dans les champs du tableau par vous-même.

Si vous utilisez trois captures, vous pouvez simplement utiliser table.pack pour créer votre tableau de lignes avec trois entrées.

2voto

tonypdmtr Points 2013

En supposant que vous n'ayez que des lignes valides dans votre fichier de données (locations.txt), il vous suffit de modifier la ligne :

tbllinesx[i] = line

à :

tbllinesx[i] = { line:match '(%d+)%s+(%d+)%s+(%d+)' }

Cela placera chacun des trois numéros délimités par des espaces dans son propre emplacement dans un tableau pour chaque ligne séparément.

Edit : Le répété %d+ Une partie du modèle devra être ajustée en fonction de vos données réelles. %d+ suppose des entiers simples, vous avez besoin de quelque chose de plus impliqué pour un éventuel signe moins ( %-?%d+ ) et pour les points éventuels ( %-?%d-%.?%d+ ), et ainsi de suite. Bien sûr, la méthode la plus simple serait d'attraper tout ce qui n'est pas de l'espace ( %S+ ) comme un nombre potentiel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X