Csv Utils

lua-users home
wiki

Escape CSV quotes

-- Used to escape "'s by toCSV

function escapeCSV (s)

  if string.find(s, '[,"]') then

    s = '"' .. string.gsub(s, '"', '""') .. '"'

  end

  return s

end

Convert from CSV string to table

-- Convert from CSV string to table (converts a single line of a CSV file)

function fromCSV (s)

  s = s .. ','        -- ending comma

  local t = {}        -- table to collect fields

  local fieldstart = 1

  repeat

    -- next field is quoted? (start with `"'?)

    if string.find(s, '^"', fieldstart) then

      local a, c

      local i  = fieldstart

      repeat

        -- find closing quote

        a, i, c = string.find(s, '"("?)', i+1)

      until c ~= '"'    -- quote not followed by quote?

      if not i then error('unmatched "') end

      local f = string.sub(s, fieldstart+1, i-1)

      table.insert(t, (string.gsub(f, '""', '"')))

      fieldstart = string.find(s, ',', i) + 1

    else                -- unquoted; find next comma

      local nexti = string.find(s, ',', fieldstart)

      table.insert(t, string.sub(s, fieldstart, nexti-1))

      fieldstart = nexti + 1

    end

  until fieldstart > string.len(s)

  return t

end

Convert from table to CSV string

-- Convert from table to CSV string

function toCSV (tt)

  local s = ""

-- ChM 23.02.2014: changed pairs to ipairs 

-- assumption is that fromCSV and toCSV maintain data as ordered array

  for _,p in ipairs(tt) do  

    s = s .. "," .. escapeCSV(p)

  end

  return string.sub(s, 2)      -- remove first comma

end


RecentChanges · preferences
edit · history
Last edited February 23, 2014 5:32 pm GMT (diff)