1 (2014-09-02 23:41:47 отредактировано GREEN_X5)

Тема: Lua: Как преобразовать строку с разделителями в таблицу?

Вот как раз вопрос по циклам. )
Существует ли подходящий for each чтобы легко разобрать в массив строку типа
RSH3,VBZ2,O4Z2,O2Z2,SiM3,SiH3,SiF3,RIH3,RIM3,LKH3,LKZ2,GDZ2,GMZ2,GZH3,GZZ2,EuZ2,EDZ2,SiZ2,RIZ2,
Или нужно перебирать каждый знак строки? В Купайле вроде есть такое...

Вот такую конструкцию сейчас накидал. Это самое изящное что можно сделать в Lua? )))

function GetCodes(sec)

    local list
    list = getClassSecurities(sec)
    local len
    len=string.len(list)
    local cod={}
    local REFi=0
    local item = "NO"
    local n=0
    for i=0,len-1,1 do
        item = "NO"
        if string.sub(list,i,i)==","  then
            item = string.sub(list,REFi,i-1)
            if item~=nil then
                cod[n]=item
                logMemo:Add(n.." "..item)
                REFi=i+1
                n=n+1
            end                
        end
    end
    return cod
end

2 (2014-09-03 08:03:20 отредактировано swerg)

Re: Lua: Как преобразовать строку с разделителями в таблицу?

гугление подсказывает такой вот изящный вариант:

Добавляем метод к string:

function string:split( inSplitPattern, outResults )
   if not outResults then
      outResults = { }
   end
   local theStart = 1
   local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
   while theSplitStart do
      table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) )
      theStart = theSplitEnd + 1
      theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
   end
   table.insert( outResults, string.sub( self, theStart ) )
   return outResults
end

Использование:

local myString = "XXX,YYY,ZZZ"

local myTable = myString:split(",")

for i = 1, #myTable do
    -- обработка таблицы поэлементно
    --  ..... myTable[i]  .....
end

admin:
GREEN_X5, ваш вопрос выделил в отдельную тему, надеюсь вы не против.

3

Re: Lua: Как преобразовать строку с разделителями в таблицу?

Короче те же штаны, только вид сбоку. ) Вобщем нет такого интерпретируемого цикла...
Спасибо за ответ!
Вот думаю, можно было бы подумать насчет for pair или for ipair. Но загвоздка в том, что блоки текста между запятыми не в кавычках, поэтому цикл не сможет прочитать их как индексы или значения таблицы, правильно я понимаю?

4

Re: Lua: Как преобразовать строку с разделителями в таблицу?

local example = "RSH3,VBZ2,O4Z2,O2Z2,SiM3,SiH3,SiF3,RIH3,RIM3,LKH3,LKZ2,GDZ2,GMZ2,GZH3,GZZ2,EuZ2,EDZ2,SiZ2,RIZ2,"
for i in string.gmatch(example, "(%w+)") do
  print(i)
end

5

Re: Lua: Как преобразовать строку с разделителями в таблицу?

mbul, реально круто, спасибо. )
Блин, надо как-то найти нормальное описание строкового синтаксиса, всякие w и %...

6

Re: Lua: Как преобразовать строку с разделителями в таблицу?

Способ хорош, но надо понимать его ограничения и не забывать про них.
Например то, что в конце строки обязательно должна стоять запятая )

GREEN_X5 пишет:

Короче те же штаны, только вид сбоку. ) Вобщем нет такого интерпретируемого цикла...

Не, ну можно же иначе сделать синтаксически, хоть суть и та же самая будет, конечно:

local myString = "XXX,YYY,ZZZ"

for i,v in ipairs(myString:split(",")) do
    -- обработка таблицы поэлементно
    --  .... элемент в  v  .....
    message (v, 0)
end

7

Re: Lua: Как преобразовать строку с разделителями в таблицу?

Ну да, чем проще, тем лучше и понятнее. ) Выбрал для себя вариант с запятой в конце.
Подскажите ещё пожалуйста, вот так строка разбивается на субстроки до и после знака равно, но вторая субстрока берется только до первой запятой. Как заставить взять ВСЁ после знака равно?

Line = "codefs=RIU4,RIZ4,RNU4,"
for k, v in string.gmatch(Line,"(%w+)=(%w+)")

--чтобы стало k="codefs", v="RIU4,RIZ4,RNU4,"

8

Re: Lua: Как преобразовать строку с разделителями в таблицу?

Line = "codefs=RIU4,RIZ4,RNU4,"
t={}
for k, v in string.gmatch(Line,"(%w+)=(.*),") do
  t[k]={}
  for vv in string.gmatch(v,"(%w+)") do
    t[k][#t[k]+1]=vv
  end
end

t={ "codefs"={"RIU4","RIZ4","RNU4"}}

9 (2014-09-05 11:42:11 отредактировано GREEN_X5)

Re: Lua: Как преобразовать строку с разделителями в таблицу?

mbul,
очередное спасибище! ) Вчера вышел из положения вот таким кодом, отрабатывает вроде, значение распихиваю в другую таблицу позже

ravno = string.find(line,"=") + 0
if ravno >1 then
   k=string.sub(line,1,ravno-1) 
   v=string.sub(line,ravno+1)
   settings[k] = v
end

Ваш вариант конечно правильнее и короче. )
И может быть подскажете где посмотреть подробное описание операторов %w*+ и прочих для работы в строках? В http://www.lua.ru/doc/5.4.html только пара примеров, гугл нифига не рулит или не знаю как задать запрос...

10

Re: Lua: Как преобразовать строку с разделителями в таблицу?

http://www.lua.org/pil/20.2.html