Lua:
Trabalhando com CSV

Como fazer:

Em Lua, trabalhar com arquivos CSV pode ser abordado usando operações básicas de IO (Entrada/Saída) de arquivos fornecidas pela linguagem, sem a necessidade de bibliotecas externas para tarefas simples. Para operações mais complexas, como lidar com casos especiais (ex.: vírgulas dentro dos valores), pode ser benéfico usar bibliotecas de terceiros como lua-csv.

Lendo um arquivo CSV

Aqui está um exemplo simples para ler um arquivo CSV linha por linha, dividindo cada linha em valores baseados no separador de vírgula.

function parseCSVLine(line)
    local result = {}
    local from = 1
    local sep = ","
    local field
    while true do
        local start, finish = string.find(line, sep, from)
        if not start then
            table.insert(result, string.sub(line, from))
            break
        end
        field = string.sub(line, from, start - 1)
        table.insert(result, field)
        from = finish + 1
    end
    return result
end

local file = io.open("example.csv", "r")
for line in file:lines() do
    local values = parseCSVLine(line)
    for i, v in ipairs(values) do
        print(i, v)
    end
end
file:close()

Saída de exemplo (para um example.csv com conteúdo “name,age\newlineJohn Doe,30\newlineJane Doe,32”):

1	name
2	age
1	John Doe
2	30
1	Jane Doe
2	32

Escrevendo um arquivo CSV

Para gerar um arquivo CSV, você simplesmente constrói strings com valores separados por vírgulas e os escreve em um arquivo linha por linha.

local data = {
    {"name", "age"},
    {"John Doe", "30"},
    {"Jane Doe", "32"}
}

local file = io.open("output.csv", "w")
for _, v in ipairs(data) do
    file:write(table.concat(v, ","), "\n")
end
file:close()

Isso criaria (ou sobrescreveria) um arquivo output.csv com os dados especificados.

Usando lua-csv

Para um tratamento mais avançado de CSV, incluindo suporte para aspas e caracteres de escape, a biblioteca lua-csv é uma escolha robusta.

Primeiro, instale-a usando LuaRocks:

luarocks install lua-csv

Então, ler um arquivo CSV fica tão simples quanto:

local csv = require("csv")

-- Lendo de um arquivo
for fields in csv.open("example.csv") do
    for i, v in ipairs(fields) do
        print(i, v)
    end
end

E escrevendo em um CSV com aspas e escaping adequados:

local file = csv.open("output.csv", {write=true})

local data = {
    {"name", "profession", "location"},
    {"John Doe", "Software Engineer", "New York, NY"},
    {"Jane Doe", "Data Scientist", "\"San Francisco, CA\""}
}

for _, v in ipairs(data) do
    file:write(v)
end

Essa abordagem lida automaticamente com complexidades como vírgulas e aspas dentro dos valores.