Lua - 在连字符的分裂CSV列

时间:2017-12-27 22:30:38

标签: csv parsing lua lua-table

我想使用Lua CSV http://lua-users.org/wiki/LuaCsv 并且需要拆分使用连字符“ - ”的列之一,例如:First-Surname到它创建的表中。我可以使用Data>在excel中手动完成。文本到列,将分割全名单元格并添加第一个和姓氏列到最后,我需要Lua在脚本中执行相同的操作:

Before
Age,Name,Start,End,Length,Score
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056

After
Age,Name,Start,End,Length,Score,First,Surname
35,Bill-Smith,2.2.2017,2.4.2017,0.2.00,2056,Bill,Smith

这是要使用的Lua csv解析器:

function ParseCSVLine (line,sep) 
    local res = {}
    local pos = 1
    sep = sep or ','
    while true do 
        local c = string.sub(line,pos,pos)
        if (c == "") then break end
        if (c == '"') then
            -- quoted value (ignore separator within)
            local txt = ""
            repeat
                local startp,endp = string.find(line,'^%b""',pos)
                txt = txt..string.sub(line,startp+1,endp-1)
                pos = endp + 1
                c = string.sub(line,pos,pos) 
                if (c == '"') then txt = txt..'"' end 
                -- check first char AFTER quoted string, if it is another
                -- quoted string without separator, then append it
                -- this is the way to "escape" the quote char in a quote. example:
                --   value1,"blub""blip""boing",value3  will result in blub"blip"boing  for the middle
            until (c ~= '"')
            table.insert(res,txt)
            assert(c == sep or c == "")
            pos = pos + 1
        else    
            -- no quotes used, just look for the first separator
            local startp,endp = string.find(line,sep,pos)
            if (startp) then 
                table.insert(res,string.sub(line,pos,startp-1))
                pos = endp + 1
            else
                -- no separator found -> use rest of string and terminate
                table.insert(res,string.sub(line,pos))
                break
            end 
        end
    end
    return res
end

1 个答案:

答案 0 :(得分:0)

假设每行的第二个值始终是名称,并且始终包含第一个连字符分隔符作为名称中的第一个或唯一连字符(不一定是安全的假设),那么您可以从中读取每一行输入(我使用了一个字符串,但这可能是一个IO阅读器或你正在使用的任何东西),使用模式将第二个值解析为名字和姓氏,将它们附加到读取的末尾然后将其写回(我将其插入表中以供演示):

%]==]