如何使用 Lua 读取文本文件中的数据并将其存储为多维数组

我有一个测试文件,每行都有一些数据(chklist.txt)。我正在尝试编写一个函数来获取那些数据,并将其存储在一个多维数组中。

chklist.txt 的示例

   text1,text1a,text1b,text1c,text1d,text1e,text1f
   text2,text2a,text2b,text2c,text2d,text2e,text2f

chklist.txt 中的文本使用引号 - 我已经尝试了单引号和双引号。 我希望将其读取为 ChkItem[1][1]、ChkItem[1][2]...

到目前为止,我已经尝试了这个和它的几个变体:

function GetCheckList()
  FileNameLIST = SCRIPT_DIRECTORY .. "chklist.txt"
  local f2 = io.open(FileNameLIST)
  for each in f2:lines() do
  indx = indx + 1
    for indx2=1,7 do
      ChkItem[indx] = {}
    end
    ChkItem[indx] = each
  end
  f2:close()
end

我还尝试了 ChkItem[indx] = {each} 和 table.insert(ChkItem, each)

table.insert(ChkItem, {each}) 会在 ChkItem[1][1] 中返回完整的行,而不仅仅是 text1 使用 table.insert(ChkItem, each) 我得到了与 ChkItem[1] 相同的完整行。

感谢任何关于此的帮助或见解。我之前通过为每一行设置一个变量(数组)来完成这项任务,但我更喜欢从文本文件中读取数据。

点赞
用户9922866
用户9922866

如果我理解正确,你想将文件中的文本行分成几段,以创建一个二维数组。

首先,你可以使用一个称为 lines 的方便方法循环遍历文件中的行。 假设你有一个名为 file 的文件对象。按行循环遍历它只需要这么简单:

for line in file:lines() do
    -- Do something.
end

使用这个 lines 方法,我编写了一个名为create_array_from_file的函数,我希望它具有你在问题中描述的功能。该功能需要一个名为 filename 的字符串作为参数; 它使用 string.gmatch 将每一行拆分成单独的元素,按逗号拆分每一行,这是你在示例文本文件中分离元素的方式。

-- 这个模式意味着由一个或多个非逗号字符组成的系列
local MATCH_PATTERN = "[^,]+"

local function create_array_from_file(filename)
    local file = assert(io.open(filename, "r"))
    local arr = {}
    for line in file:lines() do
        local row = {}
        for match in string.gmatch(line, MATCH_PATTERN) do
            table.insert(row, match)
        end
        table.insert(arr, row)
    end
    return arr
end

你可以根据输入文本文件的写作方式将 MATCH_PATTERN 更改为你想要的任何内容;或者,可以在 create_array_from_file 中包含第二个参数,以接受用作提供给 string.gmatch 的模式的第二个参数。

local function create_array_from_file(filename, pattern)
    local file = assert(io.open(filename, "r"))
    local arr = {}
    for line in file:lines() do
        local row = {}
        -- 当中,`MATCH_PATTERN` 被替换为函数的参数 `pattern`
        for match in string.gmatch(line, pattern) do
            table.insert(row, match)
        end
        table.insert(arr, row)
    end
    return arr
end

这个第二个版本在拆分输入文件的行时提供了更多的灵活性。

2019-12-23 05:50:03