gpt4 book ai didi

arrays - Csv 文件到 Lua 表并将行作为新表或函数访问()

转载 作者:行者123 更新时间:2023-12-04 14:19:24 26 4
gpt4 key购买 nike

目前我的代码有简单的表格,其中包含每个对象所需的数据,如下所示:

infantry = {class = "army", type = "human", power = 2} 

cavalry = {class = "panzer", type = "motorized", power = 12}

battleship = {class = "navy", type = "motorized", power = 256}

我在各种函数中使用表名作为标识符,将它们的值作为一个函数逐一处理,只需调用该函数即可访问这些值。

现在我想将这些数据存储在电子表格(csv 文件)中,而不是像这样:

Name    class  type     power 

Infantry army human 2

Cavalry panzer motorized 12

Battleship navy motorized 256

电子表格不会超过 50 行,我希望将来能够增加列数。

尝试了我在此处发现的类似情况下的几种方法,但由于缺乏技能,我无法访问嵌套表中的任何值。我认为这是因为在从 csv 文件读取每一行到表格后我不完全理解表格结构是如何的,因此根本无法打印任何值。

如果有一种方法可以从表中获取 name,class,type,power 并将该行用作我的旧简单表,我将不胜感激提供一个教育示例。另一种方法可能是从 csv 文件中逐行声明新表,其行为与我的旧简单表完全一样。我不知道这是否可行。

使用 Lua 5.1

最佳答案

您可以将 csv 文件作为字符串读取。我将在这里使用多行字符串来表示 csv。

gmatch 与模式 [^\n]+ 将返回 csv 的每一行。具有模式 [^,]+gmatch 将返回给定行中每一列的值。

如果添加了更多行或列,或者如果列四处移动,只要第一行包含标题信息,我们仍然会可靠地转换信息。

唯一不能移动的列是第一个 Name 列,如果移动它,它将更改用于将行存储到表中的键。

使用 gmatch 和 2 种模式,[^,]+[^\n]+,您可以将字符串分成每个csv 的行和列。注释如下代码:

local csv = [[
Name,class,type,power
Infantry,army,human,2
Cavalry,panzer,motorized,12
Battleship,navy,motorized,256
]]

local items = {} -- Store our values here
local headers = {} --
local first = true
for line in csv:gmatch("[^\n]+") do
if first then -- this is to handle the first line and capture our headers.
local count = 1
for header in line:gmatch("[^,]+") do
headers[count] = header
count = count + 1
end
first = false -- set first to false to switch off the header block
else
local name
local i = 2 -- We start at 2 because we wont be increment for the header
for field in line:gmatch("[^,]+") do
name = name or field -- check if we know the name of our row
if items[name] then -- if the name is already in the items table then this is a field
items[name][headers[i]] = field -- assign our value at the header in the table with the given name.
i = i + 1
else -- if the name is not in the table we create a new index for it
items[name] = {}
end
end
end
end

以下是使用 I/O 库加载 csv 的方法:

-- Example of how to load the csv. 
path = "some\\path\\to\\file.csv"
local f = assert(io.open(path))
local csv = f:read("*all")
f:close()

您也可以使用 io.lines(path) 代替 for 循环部分中的 csv:gmatch("[^\n]+") 。

这是使用结果表的示例:

-- print table out
print("items = {")
for name, item in pairs(items) do
print(" " .. name .. " = { ")
for field, value in pairs(item) do
print(" " .. field .. " = ".. value .. ",")
end
print(" },")
end
print("}")

输出:

items = {
Infantry = {
type = human,
class = army,
power = 2,
},
Battleship = {
type = motorized,
class = navy,
power = 256,
},
Cavalry = {
type = motorized,
class = panzer,
power = 12,
},
}

关于arrays - Csv 文件到 Lua 表并将行作为新表或函数访问(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com