2016-04-28 6 views
2

Привет, я пытаюсь преобразовать вершины, хранящиеся в файле .obj, в таблицу, которая может быть фактически использована в lua.Lua множественные замены строк string.gsub

Это то, что файл .obj выглядит следующим образом:

# Blender v2.77 (sub 0) OBJ File: '' 
# www.blender.org 
mtllib pyramid.mtl 
o Cube 
v 1.000000 0.000000 -1.000000 
v 1.000000 0.000000 1.000000 
v -1.000000 0.000000 1.000000 
v -1.000000 0.000000 -1.000000 
v -0.000000 2.000000 0.000000 
vn 0.0000 -1.0000 0.0000 
vn 0.8944 0.4472 0.0000 
vn -0.0000 0.4472 0.8944 
vn -0.8944 0.4472 -0.0000 
vn 0.0000 0.4472 -0.8944 
usemtl Material 
s off 
f 1//1 2//1 3//1 4//1 
f 1//2 5//2 2//2 
f 2//3 5//3 3//3 
f 3//4 5//4 4//4 
f 5//5 1//5 4//5 

Все, что мне нужно являются 5 строк, начиная с V, чтобы выглядеть следующим образом:

Node1= {x=1.000000, y=0.000000, z=-1.000000} 
Node2= {x=1.000000, y=0.000000, z=1.000000} 
Node3= {x=-1.000000, y=0.000000, z=1.000000} 
Node4= {x=-1.000000, y=0.000000, z=-1.000000} 
Node5= {x=-0.000000, y=2.000000, z=0.000000} 

С кодом я написал, я руководила вывод выглядеть следующим образом:

Node1= {x=1.000000 0.000000 -1.000000} 
Node2= {x=1.000000 0.000000 1.000000} 
Node3= {x=-1.000000 0.000000 1.000000} 
Node4= {x=-1.000000 0.000000 -1.000000} 
Node5= {x=-0.000000 2.000000 0.000000} 

Thats мой код, который делает работу:

inputFile = io.open("file.txt", "r") 
io.input(inputFile) 
string = io.read("*all") 
io.close(inputFile) 

outputFile = io.open("object.lua", "a") 
io.output(otputFile) 


i = 1 
for word in 
    string.gmatch(string, " .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d") do 
    print(word) 
    -- outputFile:write("Node"..i.. "= {" ..word.. "}\n") 
    outputFile:write("Node"..i.. "= {" ..string.gsub(word, "(%s)", "x=", 1).. "}\n") 
    i = i + 1 
end 

Сначала он открывает файл .obj и сохраняет все в строке. Чем он создает «object.lua». Для каждой строки, которая сопрягает этот шаблон:

1.000000 0.000000 -1.000000 

в строке, string.gmatch будет найти и записать его в файл вывода. Но сначала он должен переформатировать строку. Как вы видите, мне удалось заменить первое пространство (% s) на «x =». Кроме того, второе пространство необходимо заменить на «, y =», а третье с «, z =». Однако я не вижу, как использовать string.gsub таким образом, чтобы он мог выполнять несколько разных заметок.

Правильно ли это, и я просто делаю что-то неправильно? Или есть другой способ выполнить эту задачу?

+1

Смешное наблюдение: 'string' изменило его значение (поскольку переменная с тем же именем была введена), но' string.gmatch' остался верным! –

+0

'для x, y, z в строке: gmatch '\ nv% s + (% S +)% s + (% S +)% s + (% S +)'' ''Node' .. i .. '= {x =' ..x .. ', y =' .. y .. ', z =' .. z .. '} \ n'' –

ответ

2

Разновидностью вашего общего подхода, но с тем же результатом.

PATTERN = '^v (%S+) (%S+) (%S+)$' 

fo = io.open('object.lua','w') 

i = 1 
for line in io.lines('file.txt') do 
    if line:match(PATTERN) then 
    line = line:gsub(PATTERN,'Node'..i..'= {x=%1, y=%2, z=%3}') 
    print(line) 
    fo:write(line,'\n') 
    i = i + 1 
    end 
end 

fo:close() 
+0

Большое спасибо, что эта работа для меня! Прекрасно работает! – user148013

1

Основная проблема заключается в вызове gsub. Вы скорее сопоставляете сами числа ([^%s]), чем пространство в начале. Это делает работу:

string.gsub(word, "([^%s]) ([^%s]) ([^%s])", "x=%1 y=%2 z=%3", 1) 

Также gmatch можно упростить следующим образом:

string.gmatch(s, "v [0-9.-]* [0-9.-]* [0-9.-]*") 

Live example

 Смежные вопросы

  • Нет связанных вопросов^_^