有一个程序可以sorting一个Lua程序输出的值吗?

我需要一个程序(对于窗口),可以按字母顺序sortingLua程序执行和closures后保存的文件中的Lua值。 我必须不断地合并2个这样的文件,每次在运行比较软件之前都要手动sorting。 如果可能的话,不需要Lua就可以工作。

文件结构如下所示:

SavedVars = { ["1"] = { ["Val1"] = true, ["Val2"] = true, ["Val3"] = false, ... ["ValX"] = true, }, ["2"] = { ["Val1"] = true, ["Val2"] = true, ["Val3"] = false, ... ["ValX"] = true, }, ["X"] = { ["Val1"] = true, ["Val2"] = true, ["Val3"] = false, ... ["ValX"] = true, }, } SavedStats = { ["1"] = { ["Val1"] = 0, ["Val2"] = 1, ["Val3"] = 55, ... ["ValX"] = -55, }, ["2"] = { ["Val1"] = 0,0005, ["Val2"] = -0,0000000007648, ["Val3"] = 4, ... ["ValX"] = true, }, ["X"] = { ["Val1"] = 0, ["Val2"] = 0, ["Val3"] = 0, ... ["ValX"] = 0, }, } 

Solutions Collecting From Web of "有一个程序可以sorting一个Lua程序输出的值吗?"

改变你的Lua程序,以排序的顺序输出的东西。

我不知道你用什么来输出这个,我假设像“在Lua编程”序列化功能 ,增加了缩进。

for k,v in pairs(o) do只需要将for k,v in pairs(o) do for k,v in pairsByKeys(o) do ,用第19.3节中的pairsByKeys函数。 这是一个完整的例子,输出像你给的东西。

 -- serializes some object to the standard output. -- -- o - the object to be formatted. -- indent - a string used for indentation for tables. -- cmp - a comparison function to sort the subtables. -- May be nil, then we sort alphabetically (strings) -- or numerically (numbers). -- -- from http://www.lua.org/pil/12.1.1.html, modified to include -- indentation and sorting. -- function serialize_sorted (o, indent, cmp) if type(o) == "nil" then -- this should not really happen on recursion, as nil can -- be neither key nor value in a table. io.write("nil") elseif type(o) == "number" then io.write(o) elseif type(o) == "string" then io.write(string.format("%q", o)) elseif type(o) == "boolean" then io.write( tostring(o) ) elseif type(o) == "table" then io.write("{\n") local subindent = indent .. " " for k,v in pairsByKeys(o) do io.write(subindent) io.write("[") serialize_sorted(k, subindent, cmp) io.write("] = ") serialize_sorted(v, subindent, cmp) io.write(",\n") end io.write(indent .. "}") else error("cannot serialize a " .. type(o)) end end -- iterates over a table by key order. -- -- t - the table to iterate over. -- f - a comparator function used to sort the keys. -- It may be nil, then we use the default order -- for strings or numbers. -- -- from http://www.lua.org/pil/19.3.html -- function pairsByKeys (t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator counter local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end -- our unsorted test table testTable = { ["2"] = { ["Val1"] = true, ["ValX"] = true, ["Val2"] = true, ["Val3"] = false, }, ["1"] = { ["ValX"] = true, ["Val1"] = true, ["Val2"] = true, ["Val3"] = false, }, ["X"] = { ["Val3"] = false, ["ValX"] = true, ["Val1"] = true, ["Val2"] = true, }, } -- the output. io.write("SavedVars = ") serialize_sorted(testTable, "") 

如果你不能改变程序,你可以在Lua中加载输入,然后用这个序列化方法重新输出。 以下程序执行此操作(使用上面的serialize_sorted方法):

 -- loads a string to a table. -- this executes the string with the -- environment of a new table, and then -- returns the table. -- -- The code in the string should not need -- any variables it does not declare itself, -- as these are not available on runtime. -- It runs in a really empty environment. function loadTable(data) local table = {} local f = assert(loadstring(data)) setfenv(f, table) f() return table end -- read input from stdin local data = io.read("*all") -- load table local testTable = loadTable(data) -- output everything for k, v in pairsByKeys(testTable) do io.write(k .. " = ") serialize_sorted(v, "") io.write("\n") end 

这可以像你的问题一样创建文件,即使是缩进,但用正确的逗号。

如果你有一些带有字符串和数字键的表,那么这个排序就不起作用 – 那么你将不得不考虑如何对它们进行相对排序,并传递一个比较函数。