Lua:表操作-添加&;基于另一个表减去键/值对

Lua:表操作-添加&;基于另一个表减去键/值对,lua,queue,key-value,lua-table,Lua,Queue,Key Value,Lua Table,我正在尝试使用接收到的输入并基于找到的特定输入(ID#)构建一个表。这个输入还包含我需要解析的变量,我使用这些其他变量来构建一个完整的数据字符串。在同一个文件中,是一个项目应记录在其中的列表。一旦文件被接收并被Lua脚本完全解析,它将以特定的顺序发送字符串,该序列也位于接收到的同一文件中 例如: 收到的输入: Log Entries Received: ID1 - 9:25AM - 10:15AM - Mike Stephens - 2/12/2015 - 111 Dynamo Dr. ID2

我正在尝试使用接收到的输入并基于找到的特定输入(
ID#
)构建一个表。这个输入还包含我需要解析的变量,我使用这些其他变量来构建一个完整的数据字符串。在同一个文件中,是一个项目应记录在其中的列表。一旦文件被接收并被Lua脚本完全解析,它将以特定的顺序发送字符串,该序列也位于接收到的同一文件中

例如:

收到的输入

Log Entries Received:
ID1 - 9:25AM - 10:15AM - Mike Stephens - 2/12/2015 - 111 Dynamo Dr.
ID2 - 8:07AM - 12:20PM - Gary Roberts - 1/23/2015 - 1212 Badger Way
ID3 - 11:46AM - 1:31PM - Trishia Major - 2/10/2015 - 325 March Manor
ID4 - 2:49PM - 3:13PM - Harry Davis - 12/21/2014 - 844 Anapolis Dr.
ID5 - 7:56AM - 8:47AM - Mary Hudson - 1/19/2015 - 9124 Royal Dr.
ID6 - 9:41AM - 4:16PM - Mark Harrison - 1/29/2015 - 583 Connecticut Rd.
ID7 - 10:25AM - 12:45PM - Jennifer Smith - 12/30/2014 - 42 Rodding Rd.
End of Log Entries

Order to be Sent:
ID3 - ID2 - ID5 - ID1 - ID7 - ID4 - ID6
End of Order
现在,
ID#
按时间顺序接收。。。1、2、3、4等;直到收到所有输入字符串。在接收到的所有这些数据的末尾,是另一个列表,其中应该处理字符串。这是一个完整的文件

起初,我认为最好有两个独立的表,每个表都在各自独立的功能中构建和维护。第一个函数将接收队列的顺序,将表的键与接收顺序中的值(ID#)配对。这发生在下面名为
函数iD\u顺序(日志队列)
的函数中。第二个函数将使用输入数据构建完成的字符串,可以在
函数字符串构建(log\u input)
中找到。我想构建第二个表,将第二个表的键设置为字符串中的ID,并将值设置为完成的字符串本身

我遇到的问题是如何将这两个函数一起使用,以便在发送下一个函数时,它会根据接收到的队列进行发送。另外,我希望这样做,一旦成功地传递了整个队列,它就会完全删除这两个表,这样这个过程就可以从头开始重复

以下是我迄今为止根据这些信息得出的结论,以及我对最佳方法的想法

function string_build(log_input)  -- takes input and creates strings (don't know how to build table found in this function)
    t_msg = {}
    for iD, time_In, time_Out, usr_Name, date, usr_Addr in input:gmatch("(ID%d)|(.-)|(.-)|(.-)|(.-)|(.-)") do
        finish_Str = "Operator Name: "..usr_Name.." (ID#:"..iD..") on "..date.." signed in at "..time_In.." and signed out at "..time_Out.." at "..usr_Addr.." open house location."
    end
    for k,v in pairs (t_msg) do
        t_msg.iD = finish_Str -- I strongly doubt this is correct????
    end
end

function iD_Order(log_queue) -- takes queue and puts values = order of ID#'s
    t_Queue = {}
    for iD_nmbr in log_queue:match("(ID%d)") do
        for k,v in pairs (t_Queue) do
            table.insert(t_Queue, #t_Queue, iD_nmbr)
        end
    end
end

function log(input) -- main function that receives outside input and sends it to appropriate functions
    local buffer = ""
    input = input:gsub("%s-%s", "|")
    buffer = buffer..input.."|"
    log_input = input:match("Log Entries Received:(.*)End of Log Entries")
    log_queue = input:match("Order to be Sent:(.*)End of Order")
    if log_input then
         string_build(log_input)
         buffer = buffer:sub(#log_input)
    end
    if log_queue then
         iD_Order(log_queue)
         buffer = buffer:sub(#log_queue)
    end
end
在这里,我不确定什么是最佳实践。作为一名编程新手,我正在努力学习最佳实践/思维方式。我认为,让一个表以完全不同的功能依赖另一个表可能是一种不好的做法?我不确定。但是我想用另一个函数从
function iD\u Order(log\u queue)
和使用
function string\u build(log\u input)
创建的字符串中抓取表,然后根据
iD
变量选择它们,这可能会很混乱,并且在最后删除表时可能会导致问题

我认为,如果
t\u队列
的键与完成字符串中的
iD
变量匹配,则最好将完成的字符串直接发送到
t\u队列
。但我很难弄明白怎么做

  • 任何有助于理解是否可以通过一个或两个函数来实现这一点的帮助都是非常好的
  • 我认为最好是在一个函数中完成所有操作,但无法理解。我能得到一些帮助来解决这个问题吗
  • 一旦整个表被构建并发送回另一个源,删除整个表的最佳方法是什么?这些完成的字符串将发送给已填写的订单。它可能是即时的,可能需要几个小时。但最后,我希望在发送最后一个字符串后清除表

我感谢所有的帮助、意见和批评。

你的方法似乎朝着正确的方向发展。 由于您的
ID
是唯一的,并且它们是您要用来引用日志条目的值,因此将它们用作输入表的键是有意义的,可以作为字符串(
“ID1”
)或数字(
1
),但数字可能更好一些。由于订单表只是一个键序列,所以按任何顺序打印都非常容易

处理函数之间依赖关系的一个好方法是为日志条目定义通用格式。在接下来的某个地方,您可能需要修改日志条目、按用户名排序等,以便将它们解析到表中,并将字段分隔开来

独立的输入和输出操作 分离输入和输出也是很有帮助的,接下来您可能有许多获取日志条目的方法,以及许多输出它们的方法,因此避免耦合输入和输出

保持作用域在本地 通常最好在函数中使用
local
变量并返回结果,这样每次调用都不会更改全局表。如果您想解析多个文件,这可能会导致一些意外行为。当函数退出时,局部变量将消失(除非已返回),因此在函数
reorder_log_entries()
中,创建的两个表在完成时都将被销毁,您可以再次调用它,因此不必担心删除/清空表。下面的代码是我如何组织功能的,但它不会读/写文件

function parse_order(log_order)
    local order = {} -- make it local to avoid clashes
    for id in log_order:gmatch("ID(%d)") do
        order[#order + 1] = tonumber(id) -- append id to table.
    end
    return order -- {3, 2, 5, 1, 7, 4, 6} in example.
end

function parse_log_entry(entry)
    local ID, time_In, time_Out, usr_Name, date, usr_Addr =
       entry:match("ID(%d) %- (.-) %- (.-) %- (.-) %- (.-) %- (.-)")
    return {id=tonumber(ID), time_in=time_In, time_out=time_Out,
        user_name=usr_Name, date=date, user_addr=usr_Addr}
end

function format_log_entry(entry)
    return "Operator Name: "..entry.user_name
       .." (ID#:"..entry.id..") on "
       ..entry.date.." signed in at "..entry.time_in
       .." and signed out at "..entry.time_out
       .." at "..entry.user_addr.." open house location."
end

input = [[Log Entries Received:
ID1 - 9:25AM - 10:15AM - Mike Stephens - 2/12/2015 - 111 Dynamo Dr.
ID2 - 8:07AM - 12:20PM - Gary Roberts - 1/23/2015 - 1212 Badger Way
ID3 - 11:46AM - 1:31PM - Trishia Major - 2/10/2015 - 325 March Manor
ID4 - 2:49PM - 3:13PM - Harry Davis - 12/21/2014 - 844 Anapolis Dr.
ID5 - 7:56AM - 8:47AM - Mary Hudson - 1/19/2015 - 9124 Royal Dr.
ID6 - 9:41AM - 4:16PM - Mark Harrison - 1/29/2015 - 583 Connecticut Rd.
ID7 - 10:25AM - 12:45PM - Jennifer Smith - 12/30/2014 - 42 Rodding Rd.
End of Log Entries

Order to be Sent:
ID3 - ID2 - ID5 - ID1 - ID7 - ID4 - ID6
End of Order]]


-- read the log entries from the input string
function reorder_log_entries(input)
    local log = {}
    local log_paragraph = input:match("Log Entries Received:(.*)End of Log Entries")
    for line in log_paragraph:gmatch("%s*([^\r\n]+)") do
       entry = parse_log_entry(line)
       log[entry.id] = entry
    end
    local order = parse_order(input:match("Order to be Sent:(.*)End of Order"))
    for _, id in ipairs(order) do
       print(format_log_entry(log[id]))
    end
end

非常简单易懂。非常感谢。关于你的回答,我确实有一个问题。对于ipairs(order)do…,为什么在此处加下划线?难道你不能在ipairs(订单)中输入“k,v的顺序”吗?那是同一件事吗?另外,我不明白上面的log_段:gmatch第5行。那个匹配序列到底在用括号/胡萝卜寻找什么?再次感谢你@Pwrcdr87下划线用于不使用的变量(扔掉变量),因此
对于k,v
效果很好,但在代码中说“我不需要密钥,忘了它”很好。胡萝卜类似于not,因此
“[^\r\n]+”
匹配一个或多个非换行符。例如,for循环将取
“Hello\r\nWorld this is me\r\n”
并迭代
“Hello”
,然后
“World this is me”
(使用换行符rem