Lua:
Lavorare con i CSV

Come fare:

In Lua, lavorare con file CSV può essere affrontato utilizzando le operazioni di IO su file di base fornite dal linguaggio, senza la necessità di librerie esterne per compiti semplici. Per operazioni più complesse, come la gestione di casi speciali (ad esempio, virgole all’interno dei valori), potrebbe essere vantaggioso utilizzare librerie di terze parti come lua-csv.

Leggere un file CSV

Ecco un esempio semplice per leggere un file CSV riga per riga, dividendo ogni riga in valori basati sul separatore di virgola.

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()

Esempio di output (per un example.csv con contenuto “name,age\newlineJohn Doe,30\newlineJane Doe,32”):

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

Scrivere un file CSV

Per generare un file CSV, è sufficiente costruire stringhe con valori separati da virgole e scriverle in un file riga per riga.

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()

Questo creerebbe (o sovrascriverebbe) un file output.csv con i dati specificati.

Usare lua-csv

Per una gestione CSV più avanzata, inclusa il supporto per virgolette e caratteri di escape, la libreria lua-csv è una scelta robusta.

Prima, installala usando LuaRocks:

luarocks install lua-csv

Poi, leggere un file CSV diventa semplice come:

local csv = require("csv")

-- Lettura da un file
for fields in csv.open("example.csv") do
    for i, v in ipairs(fields) do
        print(i, v)
    end
end

E scrivere su un CSV con virgolettatura ed escaping appropriati:

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

Questo approccio gestisce automaticamente complessità come virgole e virgolette all’interno dei valori.