Lua:
עובדים עם CSV

איך לעשות:

בLua, עבודה עם קבצי CSV יכולה להתקיים באמצעות פעולות קלט/פלט קובצים בסיסיות שהשפה מספקת, ללא הצורך בספריות חיצוניות למשימות פשוטות. עם זאת, לטיפול בפעולות מורכבות יותר, כמו טיפול במקרים מיוחדים (לדוגמה, פסיקים בתוך ערכים), יכול להיות רווחי להשתמש בספריות חיצוניות כמו lua-csv.

קריאת קובץ CSV

הנה דוגמה פשוטה לקרוא קובץ CSV שורה אחר שורה, תוך פיצול כל שורה לערכים על פי הפסיק.

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

פלט לדוגמה (עבור example.csv עם התוכן “name,age\newlineJohn Doe,30\newlineJane Doe,32”):

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

כתיבת קובץ CSV

כדי ליצור קובץ CSV, פשוט מרכיבים מחרוזות עם ערכים המופרדים בפסיקים וכותבים אותם לקובץ שורה אחרי שורה.

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

פעולה זו תביא ליצירת (או לדריסה) של קובץ output.csv עם הנתונים שצוינו.

שימוש בlua-csv

לטיפול מתקדם יותר בCSV, כולל תמיכה בציטוטים ותווי בריחה, הספריה lua-csv היא בחירה עמידה.

ראשית, התקנו אותה באמצעות LuaRocks:

luarocks install lua-csv

לאחר מכן, קריאת קובץ CSV הופכת לפשוטה כמו:

local csv = require("csv")

-- קריאה מקובץ
for fields in csv.open("example.csv") do
    for i, v in ipairs(fields) do
        print(i, v)
    end
end

וכתיבה לCSV עם ציטוט ובריחה כהלכה:

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

גישה זו מטפלת אוטומטית במורכבויות כגון פסיקים וציטוטים בתוך ערכים.