在LUA中将数组转换为字符串

Posted

技术标签:

【中文标题】在LUA中将数组转换为字符串【英文标题】:Convert array to string in LUA 【发布时间】:2018-11-30 05:02:56 【问题描述】:

试图将其转换为字符串 customLog2 = 看起来真的很像 Log = Group = ID, Pos = Numbers, Group = ID, Pos = Numbers 我试过这个

local Data = string.format( "LogBook = %s ", customLog2 )

但是因为 CustomLog 是一个数组而不是字符串或数字,所以我无法插入它。我试图将数组转换为这个VariableFile:write(Data) 的字符串,所以如果有人能提供帮助,那将是非常感谢的。

所以我希望我的输出看起来像这样 "local Data = string.format( "LogBook = %s ", customLog2 )" 这样我就可以使用 :write 然后在我新创建的文件中它应该看起来像这样 Log = Group = ID, Pos = Numbers, Group = ID, Pos = Numbers

所以这个函数的工作需要一件事。

function TableSerialization(t, i)
    local text = "\n"
    local tab = ""
    for n = 1, i + 1 do                                                                 --controls the indent for the current text line
        tab = tab .. "\t"
    end
    for k,v in pairs(t) do
        if type(k) == "string" then
            text = text .. tab .. "['" .. k .. "'] = "
        else
            text = text .. tab .. "[" .. k .. "] = "
        end
        if type(v) == "string" then
            text = text .. "'" .. v .. "',\n"
        elseif type(v) == "number" then
            text = text .. v .. ",\n"
        elseif type(v) == "table" then
            text = text .. TableSerialization(v, i + 1)
        elseif type(v) == "boolean" then
            if v == true then
                text = text .. "true,\n"
            else
                text = text .. "false,\n"
            end
        elseif type(v) == "function" then
            text = text .. v .. ",\n"
        elseif v == nil then
            text = text .. "nil,\n"
        end
    end
    tab = ""
    for n = 1, i do                                                                     --indent for closing bracket is one less then previous text line
        tab = tab .. "\t"
    end
    if i == 0 then
        text = text .. tab .. "\n"                                                     --the last bracket should not be followed by an comma
    else
        text = text .. tab .. ",\n"                                                    --all brackets with indent higher than 0 are followed by a comma
    end
    return text
end

我的输入数组可以说看起来像这样 Log = Group = WestAPC 现在这不起作用,因为 WestAPC 不是字符串,但如果 WestAPC 看起来像这样的“WestAPC”它可以工作。我需要它不是字符串形式。

【问题讨论】:

试试table.concat Group = WestAPC Group = "WestAPC" 都构造了一个表,其中包含具有相同键的单个字段,即字符串“Group”。该值是根据相应的表达式设置的。在第二种情况下,表达式是一个文字字符串。首先,表达式是一个变量。变量的值可能是nil、字符串或任何其他类型的值。在表中,如果字段值设置为nil,则从表中删除键值对。那么,你在这里的目标是什么?也许问题出在您尚未显示的代码中。 【参考方案1】:

明确地说,customLog 是一个表——即键值对的关联数组。这是一种遍历所有键/值对并将它们连接成一个字符串的简单方法:

s = ""

t = "a", "b", "c", 123, 456, 789 -- sample table
t.someKey = "some value" -- just an extra key value, to show that keys can be strings too

for k, v in pairs(t) do
    s = s .. k .. ":" .. v .. "\n" -- concatenate key/value pairs, with a newline in-between
end

print(s)

当然,如果键的值是另一个表,那么您将需要一些额外的逻辑来递归地遍历这些嵌套表。我会把它留给你作为练习:)

编辑 1: 将表格打印为字符串,显示变量值

s = ""
local ID = 123
local Numbers = 456
local Log =  Group = ID, Pos = Numbers, Group = ID, Pos = Numbers 

s = s .. ""
for k, v in next, Log do
    s = s .. ""

    for vk, vv in next, v do
        if next(v, vk) ~= nil then
            s = s .. vk .. " = " .. vv .. ", "
        else
            s = s .. vk .. " = " .. vv  
        end
    end

    if next(Log, k) ~= nil then
        s = s .. ", "
    else
        s = s .. ""
    end

end
s = s .. ""

print(s)

编辑 2: 将表格打印为字符串,显示变量名

s = ""
local ID = 123
local Numbers = 456
local Log =  Group = ID, Pos = Numbers, Group = ID, Pos = Numbers 

s = s .. ""
for k, v in next, Log do
    s = s .. ""

    i = 1
    for vk, vv in next, v do
        name = debug.getlocal(1, i)
        if next(v, vk) ~= nil then
            s = s .. vk .. " = " .. name .. ", "
        else
            s = s .. vk .. " = " .. name
        end
        i = i + 1
    end

    if next(Log, k) ~= nil then
        s = s .. ", "
    else
        s = s .. ""
    end

end
s = s .. ""

print(s)

【讨论】:

关闭但不完全是我需要的。我需要从字面上取出我的数组并将其完全按原样放入另一个文件中。所以我的数组的一个例子是 Log = Group = ID, Pos = Numbers, Group = ID, Pos = Numbers @AHamburgler 我已经编辑了我的答案。我确信此解决方案还有其他排列方式,调整逻辑的方法等。获取变量名称(上面的编辑 2)依赖于表值实际上是本地上值,所以最终解决方案取决于您的确切情况。我希望这可以帮助您获得所需的代码。 非常感谢您帮助它工作,但由于某种原因它不会传输变量。例如它会说 group = self 而不是 123。 @AHamburgler 很高兴为您提供帮助。 “self”必须在代码中的某个地方定义。它不是 Lua 中的内置符号(self 的概念是,带有冒号运算符,但不是名称“self”。如果您想发布更多代码,由您决定 - 我们可以尝试通过终点线。 我从字面上拿了你的代码并对其进行了测试,它在另一端出现了 group = self 和 Pos = event。它们没有在任何地方定义。

以上是关于在LUA中将数组转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有外部库的任何lua中将双精度转换为小字符串表示而不会丢失数据?

在Lua中将字符串中的所有字符变为小写

在Java中将字符串转换为“字符”数组

Lua 字符串转 int

如何在Java中将对象数组转换为字符串数组

如何在python中将数组字符串转换为数组[重复]