如何将CSV/TSV分隔文本文件读取为带命名字段的Lua表?
解决Lua读取CSV为带命名字段表的问题
错误原因分析
你写的table.insert(t_row, [t_header[j]] = t_line[j])存在两个核心问题:
table.insert仅用于向表的数组部分追加元素,无法用来添加带自定义键的键值对[t_header[j]] = t_line[j]是赋值语句,不能作为函数参数传递,语法本身不合法
正确实现代码
以下是完整的可运行代码,包含CSV行解析、引号去除、表头映射逻辑,完全满足t[1].col1、t[2].col3这类访问需求:
-- 读取目标CSV文件(替换为你的文件名) local file = io.open("data.csv", "r") if not file then error("无法打开目标CSV文件") end local result_table = {} local headers = nil for line in file:lines() do -- 提取每行带双引号的字段,自动去除引号 local fields = {} for field_content in line:gmatch('"([^"]+)"') do table.insert(fields, field_content) end -- 处理第一行表头 if not headers then headers = fields else -- 构建当前行的键值对表 local row = {} for idx = 1, #headers do -- 直接用表头字段作为键赋值 row[headers[idx]] = fields[idx] -- 可选:将数值型字段转为Lua数字类型(比如col1、col3) local num_val = tonumber(fields[idx]) if num_val then row[headers[idx]] = num_val end end -- 将行表加入结果总表 table.insert(result_table, row) end end file:close() -- 测试访问效果 print(result_table[1].col1) -- 输出:1 print(result_table[2].col3) -- 输出:9.7
关键说明
- 用
gmatch('"([^"]+)"')匹配字段,直接提取双引号内的内容,避免手动处理逗号分割的麻烦(适用于字段内不含逗号的场景) - 表头行单独存储,后续每行数据循环对应表头字段,通过
row[表头字段] = 字段内容的方式创建带命名字段的表 - 可选的数值转换:自动识别数字型字段并转为Lua数字,方便后续数值计算
内容的提问来源于stack exchange,提问作者user22099079
相关产品推荐
相关产品推荐

