GOM引擎CSV表格读取怎么用 - CSVOpenCache与单元格数据读取场景
摘要:GOM引擎CSV表格读取靠CSVOpenCache把表格加载进内存,再用CSVGetCellInfo取行列数、CSVGetCellText读单元格、CSVFindTextRow反查行号。本文对照四个命令参数顺序,说明行列号从零计数、常量名大写、缓存改表需重载等注意点,给出转生表从建表到遍历的实操流程。…
做转生系统的时候,我最初把每一级转生的属性加成、需求材料数量全硬编码在NPC脚本里,转生等级一改就要翻几十行脚本。后来换了个思路,把这些数值丢进CSV表格里,脚本按行按列去读,改数值只动表格不动脚本。
CSV表格读取就是GOM引擎提供的一组外部数据读取命令,核心靠CSVOpenCache把表格加载进内存,再用CSVGetCellText按行列取单元格内容。它和INI配置读取不同,CSV天然适合存二维数据表,比如转生等级表、道具掉落表、经验倍率表。下面把四个命令的格式、参数对照和实际落地步骤逐一讲清楚。

命令格式
GOM引擎的CSV读取一共四个配套命令,分工明确:加载缓存、取行列总数、读单元格内容、按内容反查行号。做这类表格数据读取脚本时,先从CSVOpenCache命令入手理解缓存机制。
CSVOpenCache 文件路径
CSVGetCellInfo 文件路径 最大行数保存变量 最大列数保存变量
CSVGetCellText 文件路径 行数 列数 保存变量
CSVFindTextRow 文件路径 字符串 开始行 结束行 列数 查找方向 保存变量
除了命令式读取,还支持常量式读取。表格文件加载缓存后,文件名去掉后缀转大写就是常量名,比如Test.csv加载后用<$TEST(行号,列号)>直接取值。

参数对照
四个命令的参数含义对照如下:
| 命令 | 参数顺序 | 作用 |
|---|---|---|
| CSVOpenCache | 文件路径 | 把CSV文件整体加载到内存,后续读取走缓存 |
| CSVGetCellInfo | 文件路径 行数变量 列数变量 | 取回表格的总行数和总列数 |
| CSVGetCellText | 文件路径 行数 列数 保存变量 | 读取指定行列的单元格文本 |
| CSVFindTextRow | 文件路径 查找串 起始行 结束行 列 方向 保存变量 | 按内容反查它出现在第几行 |
CSV文件本身用逗号分隔每一列,分号开头的行是注释,读取时自动忽略。列号和行号从零开始计数,第一行第一列就是(0,0)。查找方向参数填零表示取最先出现的行,填一表示取最后出现的行。下面详细讲CSVGetCellText用法。
缓存模式和非缓存模式的区别在于:调用CSVOpenCache后所有读取都走内存,速度快;不调用缓存直接读单元格,每次都实时读磁盘文件,改完表格立即生效但性能略低。不常改动的表格建议放在QM的启动触发段里加载一次。
新手易错点
第一个易错点是行列号基数搞错。很多新手习惯性从一开始数第一行,结果读到了表头或者空行。GOM的CSV读取行号列号都是从零开始,转生等级0对应的是第0行。
第二个易错点是注释行干扰统计。CSV里分号开头的行会被引擎忽略,但CSVGetCellInfo取总行数时算不算注释行,实际测试要自己跑一遍。我习惯在表格顶部留一行表头,数据从第0行开始,遍历时跳过头两行。
第三个易错点是常量名大小写。表格文件Test.csv对应的常量是TEST,全大写。写成<$test(1,2)>会取不到值,这个大小写问题卡过不少人。
第四个易错点是改完CSV不重载。用了缓存模式后,直接改CSV文件内容不会自动更新内存,需要重新执行一次CSVOpenCache命令才能读到新数据。

实操步骤
下面以转生属性表为例,演示从建CSV到脚本读取的完整流程。表格放在D:\本地传奇版本\Mir200\Envir\QuestDiary目录下。
第一步,新建Test.csv文件,按列写入转生等级、当前攻击倍数、下级倍数、需求材料和材料数量,分号开头写注释说明。
;转生等级表
转生等级,当前属性,下级属性,需求材料,材料数量
0,当前攻击1.05倍,1.10倍,转生晶石,1
1,当前攻击1.10倍,1.15倍,转生晶石,2
2,当前攻击1.15倍,1.20倍,转生晶石,3
3,当前攻击1.20倍,1.25倍,转生晶石,4
第二步,在NPC脚本里先取总行数,再用While循环逐行读出前三列内容,通过Sendmsg打印到聊天框验证。
[@测试]
#act
CSVGetCellInfo ..\QuestDiary\Test.csv N$总行数 N$总列数
Mov N$行数 0
While N$行数 < N$总行数
CSVGetCellText ..\QuestDiary\Test.csv <$STR(N$行数)> 0 S0
CSVGetCellText ..\QuestDiary\Test.csv <$STR(N$行数)> 1 S1
CSVGetCellText ..\QuestDiary\Test.csv <$STR(N$行数)> 2 S2
Sendmsg 6 第<$STR(N$行数)>行:<$STR(S0)> <$STR(S1)> <$STR(S2)>
Inc N$行数 1
EndWhile
第三步,用CSVFindTextRow按内容反查行号,比如找攻击1.25倍对应第几行,把结果存入变量。
CSVFindTextRow ..\QuestDiary\Test.csv 1.25倍 0 10 2 0 N0
Sendmsg 6 1.25倍在第<$STR(N0)>行
第四步,如果表格不常改动,在QM启动触发段执行一次CSVOpenCache,之后用常量<$TEST(1,2)>直接取值,省去每次路径调用。
CSVOpenCache ..\QuestDiary\Test.csv
SendMsg 7 第一行第二列值为:<$TEST(1,2)>
FAQ问答
1. 问:CSV表格读取和INI文件读取有什么区别?
INI是键值对结构,适合存单个配置项;CSV是二维表格,适合存多行多列的数据表。转生等级表、掉落概率表这种按行列组织的数据用CSV更顺手,开关类配置用INI更合适。两者可以配合,CSV存数据表,INI存全局开关。
2. 问:调用了CSVGetCellText却读不到内容,变量是空的怎么办?
先确认行号列号是否从零开始数,再检查CSV文件路径是否正确。路径相对于Envir目录写,用..\QuestDiary\这种相对路径。如果用了缓存模式,改完CSV后要重新执行CSVOpenCache刷新内存,否则读到的还是旧数据。(本条问题整理自百度知道真实提问:传奇服务端脚本改了游戏里面没变化,2022年11月)
3. 问:脚本改完重新加载了,CSV里的新数据为什么还是读不出来?
CSV读取走缓存时,改文件本身不会自动同步到内存。需要在脚本里重新调一次CSVOpenCache,或者重启M2引擎。如果改的是NPC脚本本身,那在M2控制台重新加载NPC脚本即可;改的是CSV数据文件,必须重新加载缓存。
4. 问:CSVFindTextRow查找内容时,开始行和结束行怎么填?
两个参数填行号范围,比如从第0行查到第10行。最后一个方向参数填零取最先匹配到的行,填一取最后匹配到的行。查找是从指定列里找,列号也要填对,找第二列就填2。
5. 问:用CSV常量读取<$TEST(1,2)>时报错取不到值怎么排查?
先确认CSV文件名是Test.csv,常量名必须全大写写成TEST。再确认在读取之前已经执行过CSVOpenCache加载缓存。常量方式仅对已加载缓存的CSV文件有效,没加载缓存直接写常量会取不到值。
6. 问:行号列号从0开始还是从1开始?能举个例子吗?
GOM的CSV读取行列号都从零开始。上面Test.csv里,第0行是表头”转生等级,当前属性…”,第1行是”0,当前攻击1.05倍…”。要取第1行第0列就是转生等级数字0,写成CSVGetCellText 路径 1 0 S0,S0里得到的是”0”。遍历时总行数用CSVGetCellInfo取回,别自己数行。
7. 问:攻速脚本加了CSV读取不生效怎么排查?
先在CSV读取命令前加一行SENDMSG打印调试,确认脚本段真的执行到了这一行。再检查CSV文件编码,建议用UTF-8或ANSI保存,编码不对会导致中文列读出来乱码。最后核对文件路径大小写和斜杠方向,路径错了引擎静默返回空。(本条问题整理自百度知道真实提问:gom攻速脚本不生效,2023年7月)
小结
CSV表格读取把二维数据从脚本里抽离到外部文件,改数值不动脚本,适合做转生表、掉落表这类结构化数据。四个命令各司其职:CSVOpenCache加载缓存,CSVGetCellInfo取行列数,CSVGetCellText读单元格,CSVFindTextRow按内容反查行号。行列号从零开始计数,常量名全大写,改完CSV要重载缓存。
本篇CSV表格读取的命令格式与示例均来自GOM引擎官方帮助文档,在本地测试版本中逐行跑通验证;不同引擎版本对CSV编码和路径的容错存在差异,实际部署时建议先用小数据表格测试。以上内容仅供本地学习调试使用。
扫描二维码推送至手机访问。
本文章M2GM发布,如需转载请注明出处。如有侵权请联系站长删除。
本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。












