Lua - convert a table into a comma separated list
Asked Answered
C

5

8

I need to convert a table into a comma separated list in order to save it to a text file. Is there a built in method for doing this in Lua?

Catena answered 5/7, 2011 at 22:35 Comment(0)
D
2

There isn't a built in function, but there are examples onthe web.

This is a decent one actually.

Discomfortable answered 5/7, 2011 at 22:43 Comment(3)
what is the underscore used for here? Haven't seen this before: for _,p in pairs(tt) do s = s .. "," .. escapeCSV(p) endCatena
since pairs(table) returns a the key and value, the _ indicates you don't care about the key.Discomfortable
Please put the full answer in the answer itself instead of only linking to an external resource.Spermine
D
16

If your table is an array, you can use table.concat to print CSVs:

t={10,20,30}
print(table.concat(t,","))

outputs 10,20,30.

Ddene answered 6/7, 2011 at 0:0 Comment(0)
D
2

There isn't a built in function, but there are examples onthe web.

This is a decent one actually.

Discomfortable answered 5/7, 2011 at 22:43 Comment(3)
what is the underscore used for here? Haven't seen this before: for _,p in pairs(tt) do s = s .. "," .. escapeCSV(p) endCatena
since pairs(table) returns a the key and value, the _ indicates you don't care about the key.Discomfortable
Please put the full answer in the answer itself instead of only linking to an external resource.Spermine
F
1

No, there is not a "built in" function for this. But it's not hard to do it yourself. I keep a script around for recursively writing Lua tables directly to files as Lua scripts, which can then be loaded and executed like Lua scripts.

--This file exports a function, WriteTable, that writes a given table out to a given file handle.

local writeKey = {};

function writeKey.string(hFile, value, iRecursion)
    WriteFormatted(hFile, "[\"%s\"]", value);
end

function writeKey.number(hFile, value, iRecursion)
    WriteFormatted(hFile, "[%i]", value);
end

local writeValue = {};

function writeValue.string(hFile, value, iRecursion)
    WriteFormatted(hFile, "[==[%s]==]", value);
end

function writeValue.number(hFile, value, iRecursion)
    WriteFormatted(hFile, "%i", value);
end

function writeValue.boolean(hFile, value, iRecursion)
    if(value) then hFile:write("true"); else hFile:write("false"); end;
end

function writeValue.table(hFile, value, iRecursion)
    WriteTable(hFile, value, iRecursion)
end

local function WriteFormatted(hFile, strFormat, ...)
    hFile:write(string.format(strFormat, ...));
end

local function WriteForm(hFile, strFormat, ...)
    hFile:write(string.format(strFormat, ...));
end

local function WriteTabs(hFile, iRecursion)
    for iCount = 1, iRecursion, 1 do
        hFile:write("\t");
    end
end

function WriteTable(hFile, outTable, iRecursion)
    if(iRecursion == nil) then iRecursion = 1; end

    hFile:write("{\n");

    local bHasArray = false;
    local arraySize = 0;

    if(#outTable > 0) then bHasArray = true; arraySize = #outTable; end;

    for key, value in pairs(outTable) do
        if(writeKey[type(key)] == nil) then print("Malformed table key."); return; end
        if(writeValue[type(value)] == nil) then
            print( string.format("Bad value in table: key: '%s' value type '%s'.", key, type(value)));
            return;
        end

        --If the key is not an array index, process it.
        if((not bHasArray) or
                (type(key) ~= "number") or
                not((1 <= key) and (key <= arraySize))) then
            WriteTabs(hFile, iRecursion);
            writeKey[type(key)](hFile, key, iRecursion + 1);
            hFile:write(" = ");
            writeValue[type(value)](hFile, value, iRecursion + 1);

            hFile:write(",\n");
        end
    end

    if(bHasArray) then
        for i, value in ipairs(outTable) do
            WriteTabs(hFile, iRecursion);
            writeValue[type(value)](hFile, value, iRecursion + 1);
            hFile:write(",\n");
        end
    end

    WriteTabs(hFile, iRecursion - 1);
    hFile:write("}");
end
Fibroma answered 5/7, 2011 at 22:40 Comment(0)
S
0

There is not a built in way, but there are a number of options that are relatively easy if you want to build it yourself. Here are some links that can help you figure out how you want to put it together:

http://www.lua.org/pil/12.1.html
http://lua-users.org/wiki/TableSerialization

Sweatbox answered 5/7, 2011 at 22:39 Comment(0)
G
0

Yes, there is a builtin method, and its been around for a very long time.

-- table.concat
local line = { "Fred", 20, 4.000 }
print(table.concat(line,","))

Output: Fred, 20, 4.000

You can convert a table to a string using this function, and simply choose a "," for a separator. You can also add a function that runs during concatenation and detects how many properties you have written, then add a new line - you can make a very complex converter if you need.

My recommendation is to break each "line" of comma separated tables and concat each one with "," then write it out. This way you can be sure that you can handle large numbers of lines, and that each line is correctly formatted.

Caveats:

  • You will have to handle strings with commas, quotes and so forth.
  • This method is mainly for ordered tables (lists or arrays). They must be indexed.
  • If you need to do processing on your values in the table, do it first. Then concat.

Reference for concat: http://www.lua.org/manual/5.1/manual.html#pdf-table.concat

Gan answered 9/9, 2020 at 4:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.