كيفية تحميل ملف نصي إلى نوع من المتغير مثل الجدول في LUA؟
سؤال
أحتاج إلى تحميل ملف لمتغيرات LUA.
دعنا نقول حصلت
name address email
هناك مساحة بين كل منها. أحتاج إلى الملف النصي الذي يحتوي على X - العديد من هذه الخطوط الموجودة فيها إلى نوع من الكائنات - أو لا يقطع سطر واحد على الأقل إلى مجموعة من السلاسل مقسوما على مسافات.
هل هذا النوع من المهمة الممكنة في لوا وكيف يجب أن أفعل هذا؟ أنا جديد جدا في لوا لكنني لم أتمكن من العثور على أي شيء مناسب على الإنترنت.
المحلول
للتوسع في إجابة أوركس:
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
ومع ذلك، فإن هذا لن يغطي القضية التي تحتوي عليها أسماءك مسافات فيها.
نصائح أخرى
تريد أن تقرأ عنه لوا أنماط, ، والتي هي جزء من مكتبة السلسلة. وبعد فيما يلي وظيفة مثال (غير اختبار):
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
هذه الوظيفة مجرد الاستيلاء على ثلاثة أسماثية تتكون من nonspace (%S
) الشخصيات. وظيفة حقيقية لديها بعض التحقق من الأخطاء للتأكد من تطابق النمط في الواقع.
إذا كان لديك التحكم في تنسيق ملف الإدخال، فستكون أفضل حالا لتخزين البيانات بتنسيق LUA كما هو موضح هنا.
إذا لم يكن كذلك، استخدم IO Library. لفتح الملف ثم استخدم مكتبة السلسلة مثل:
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