Comment charger le fichier texte en une sorte de variable table comme dans Lua?
Question
Je dois charger le fichier pour les variables de Lua.
Disons que je suis
name address email
Il y a un espace entre chaque. J'ai besoin du fichier texte qui a x nombre de ces lignes à charger dans une sorte d'objet - ou tout au moins la ligne ne peut être coupé à tableau de chaînes séparées par des espaces
.Est-ce genre de travail possible dans Lua et comment dois-je faire cela? Je suis assez nouveau pour Lua mais je ne pouvais pas trouver quoi que ce soit pertinent sur Internet.
La solution
Pour développer la réponse de UROC:
local file = io.open("filename.txt")
if file then
for line in file:lines() do
local name, address, email = unpack(line:split(" ")) --unpack turns a table like the one given (if you use the recommended version) into a bunch of separate variables
--do something with that data
end
else
end
--you'll need a split method, i recommend the python-like version at http://lua-users.org/wiki/SplitJoin
--not providing here because of possible license issues
Cependant, cela ne couvre pas le cas que vos noms ont des espaces en eux.
Autres conseils
Vous voulez en savoir plus sur Lua modèles , qui font partie du bibliothèque de chaîne de rel="noreferrer">. Voici un exemple de fonction (non testé):
function read_addresses(filename)
local database = { }
for l in io.lines(filename) do
local n, a, e = l:match '(%S+)%s+(%S+)%s+(%S+)'
table.insert(database, { name = n, address = a, email = e })
end
return database
end
Cette fonction prend seulement trois sous-chaînes composées de caractères non-espace (de %S
). Une fonction réelle aurait une erreur de vérification pour vérifier que le motif correspond en fait.
Si vous avez le contrôle sur le format du fichier d'entrée, vous serez mieux stocker les données au format Lua comme décrit ici .
Dans le cas contraire, utilisez la bibliothèque io pour ouvrir le fichier puis utilisez la comme:
local f = io.open("foo.txt")
while 1 do
local l = f:read()
if not l then break end
print(l) -- use the string library to split the string
end