Alexyz21
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору На форуме фара увидел CSV_Rainbow.moon, появился схожий вопрос по преобразованию CSV=>TSV: Код: -- CSV2TSV -- local patt,comma,tab = '"+',';','\t' local find,gsub,sub,len,fmod,insert = string.find,string.gsub,string.sub,string.len,math.fmod,table.insert local tl,ll,p,fe,fb,flag = {},len(line),1,0 while true do local b,e = find(line,patt,p) if b and e then if fmod(e-b,2)==0 then flag=not flag if flag then fb=b local s=gsub(sub(line,fe+1,fb-1),comma,tab) insert(tl,s) else fe=e insert(tl,sub(line,fb+1,fe-1)) end end p=e+1 else local s=gsub(sub(line,flag and p or fe+1,ll),comma,tab) insert(tl,s) break -- remove last quotes group if number quotes is odd (must be even) end end -- flag must be false (number quotes must be even) line='' for _,v in ipairs(tl) do line=line..v end tl=nil | , либо упрощённый вариант для заведомо корректного CSV с чётным количеством кавычек, в котором: а) все поля окавычены и не содержат '\n', б) разделитель полей ';': Код: local gsub,sub,rep,len = string.gsub,string.sub,string.rep,string.len line=sub(line..'"',2) line=gsub(line,'"(;;-)(\n?)"',function(a,b) return rep('\t',len(a))..b end) | - У кого-нибудь есть идеи как ускорить последний код, или предложите более быстрый вариант, например на LPEG? |