表格格式为

INT    STRING    INT    INT    INT    INT    INT
Id    Desc    Type    SceneId    OpenId    MaxPliesp    ClearancePlies
0    第1关    0    1    -1    110    80
1    第2关    0    1    0    120    90
2    第3关    0    2    1    130    100

1、先给出用到的字符串处理函数代码

--字符串分割函数
--传入字符串和分隔符,返回分割后的table
function string.split(str, delimiter)if str==nil or str=='' or delimiter==nil thenreturn nilendlocal result = {}for match in (str..delimiter):gmatch("(.-)"..delimiter) dotable.insert(result, match)endreturn result
end--字符串按位分割函数
--传入字符串,返回分割后的table,必须为字母、数字,否则返回nil
function string.gsplit(str)local str_tb = {}if string.len(str) ~= 0 thenfor i=1,string.len(str) donew_str= string.sub(str,i,i)            if (string.byte(new_str) >=48 and string.byte(new_str) <=57) or (string.byte(new_str)>=65 and string.byte(new_str)<=90) or (string.byte(new_str)>=97 and string.byte(new_str)<=122) then                 table.insert(str_tb,string.sub(str,i,i))                elsereturn nilendendreturn str_tbelsereturn nilend
endfunction string.trim(s)return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end  

2、表格对象代码(class见我上上篇文章lua高阶用法 OO的实现)

TableData = class()function TableData:ctor()self.data = {}
endfunction TableData:GetById(id)local num = #self.datafor i=1,num doif(id==self.data[i].Id) thenreturn self.data[i];endendprint( string.format("nil==TableData:GetById(%d)",id)) return nil;
end

3、给出读表器代码

require 'Utility/LuaStringExt'
require 'Table/TableData'TableReader = {}function TableReader.ReadAllLines(text)return string.split(text,'\n')
endfunction TableReader.IsEmptyLine(str)if(str=='' or str[0]=='#') thenreturn trueendreturn false
endlocal TableFieldType =
{INT = 0,FLOAT = 1,STRING = 2,UNKNOW = 3
}local Syntax_INT = 'INT'
local Syntax_FLOAT = 'FLOAT'
local Syntax_STRING = 'STRING'function TableReader.ParseType(str)local types = {}local fields = string.split(str,'\t')for i=1,#fields dolocal sytax = fields[i]if(Syntax_INT==sytax) thentable.insert(types,TableFieldType.INT)elseif(Syntax_FLOAT==sytax) thentable.insert(types,TableFieldType.FLOAT)elseif(Syntax_STRING==sytax) thentable.insert(types,TableFieldType.STRING)elsetable.insert(types,TableFieldType.UNKNOW)print('Error:',i,'unknow type['..sytax..']')endendreturn types
endfunction TableReader.ParseField(str)local fieldsTable = {}local fields = string.split(str,'\t')for i=1,#fields dotable.insert(fieldsTable,fields[i])endreturn fieldsTable
endfunction TableReader.ParseValue(fieldsTable,typeTable,str)local ret = {}local fields = string.split(str,'\t')for i=1,#fields doif(TableFieldType.INT==typeTable[i] or TableFieldType.FLOAT==typeTable[i]) thenret[fieldsTable[i]] = tonumber(fields[i])elseif(TableFieldType.STRING==typeTable[i]) thenret[fieldsTable[i]] = fields[i]elseprint('Error:ParseValue',i)endendreturn ret
endfunction TableReader.LoadTable(text)local tab = TableData.new();local lines = TableReader.ReadAllLines(text)local lineNum = #lineslocal types = nillocal fieldsTable = nilfor i=1,lineNum dolocal str = string.trim(lines[i])if(not TableReader.IsEmptyLine(str)) thenif(nil==types) thentypes = TableReader.ParseType(str)elseif(nil==fieldsTable) thenfieldsTable = TableReader.ParseField(str)elsetable.insert(tab.data,TableReader.ParseValue(fieldsTable,types,str))endendendreturn tab
end

4、使用代码

local table = TableReader.LoadTable(str)
local data = table:GetById(0)
print(data.Desc)

转载于:https://www.cnblogs.com/mrblue/p/5704399.html

Lua 读表代码,自动生成字段名字相关推荐

  1. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

  2. golang mysql 自动建表_mysql表结构自动生成golang struct

    a lib for golang , generate mysql table schema to golang struct mysql表结构自动生成golang struct github地址 安 ...

  3. java 生成mysql dto_如何根据动态SQL代码自动生成DTO

    当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些 ...

  4. 自定义Android注解Part2:代码自动生成

    上一期我们已经把butterknife-annotations中的注解变量都已经定义好了,分别为BindView.OnClick与Keep. 如果你是第一次进入本系列文章,强烈推荐跳到文章末尾查看上篇 ...

  5. Mybatis最入门---代码自动生成(generatorConfig.xml配置)

    [一步是咫尺,一步即天涯] 经过前文的叙述,各位看官是不是已经被Mybatis的强大功能给折服了呢?本文我们将介绍一个能够极大提升我们开发效率的插件:即代码自动生成.这里的代码自动生成包括,与数据库一 ...

  6. Spring Boot (七)MyBatis代码自动生成和辅助插件

    一.简介 1.1 MyBatis Generator介绍 MyBatis Generator 是MyBatis 官方出品的一款,用来自动生成MyBatis的 mapper.dao.entity 的框架 ...

  7. 自动产生fsm代码的工具_代码自动生成工具

    构建支持多种数据库类型的代码自动生成工具 背景: 一般的业务代码中写来写去,无外乎是先建好model,然后针对这个model做些CRUD的操作.(主要针对单表的业务操作)针对于数据库dao.mappe ...

  8. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  9. 数据访问层代码自动生成

    <%-- Name:   数据访问层代码自动生成 Author: 水木 Description: 用来生成三层结构数据访问层代码 --%> <%@ CodeTemplate Lang ...

最新文章

  1. html如何给文字添加阴影效果,css中怎么给字体添加阴影效果
  2. word doc怎么显示base64图片_win10系统word文档打印不出图片怎么办
  3. oracle 查看并行数据库,Oracle数据库并行查询出错的解决方法
  4. python时间格式_python 格式化日期
  5. 初级开发人员的缺点_我希望成为初级开发人员的事情
  6. 经典算法题--求对策字符串的最大长度
  7. 【Python】【Flask】Flask 后台发送html页面多种方法
  8. Ackerman函数 非递归 java_Ackerman(nm)函数的非递归算法.doc
  9. 【图文】在windows7 下安装和配置Memcached 64-bit for Windows
  10. 初级程序员面试题总结(一):
  11. ug冲模标准件库_UG NX插件
  12. matlab解超静定方程,超定方程和最小二乘法 | 学步园
  13. 怎样在服务器找回网站后台密码,宝塔面板忘记后台账号密码怎么找回 一条命令轻松搞定...
  14. 杭州最美的骑行路线在此!趁着春天蹬车撒欢去!
  15. LAYA和TypeScript制作H5入门——页面制作
  16. 2022年武汉专精特新小巨人企业奖励补贴以及申报条件汇总
  17. 【源码】非常有用的Vml图像画板
  18. Golang实现验证码图片OCR
  19. java assist_Java-Javaassist(一)
  20. 2017ACM-ICPC北京区域现场赛 G题 hihocoder1633

热门文章

  1. 为什么阿里工程师纷纷在内网晒代码?
  2. php数组制作查找筛选页面,php利用array_search与array_column实现二维数组查找
  3. Unity Shader着色器优化
  4. ASP.NET Core微服务(六)——【redis操作】
  5. ogg replicat 进程 abend 处理
  6. JavaWeb第一讲 Servlet的工作原理及生命周期
  7. urllib2 python3错误?用from urllib import request来代替!
  8. WebService(JAX-WS、XFire、Axis三种)获取客户端ip
  9. Flask 生成下载文件
  10. 更改hadoop native库文件后datanode故障