[寒江孤叶丶的Cocos2d-x之旅_24]Cocos2d-x LUA 解析 Csv文件的方法
来源:互联网 发布:吴青峰 知乎 编辑:程序博客网 时间:2024/05/16 16:58
原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]
博客地址:http://blog.csdn.net/qq446569365
之前项目用CocoSutdio的数据编辑器导出的Json作为数据文件读取到游戏中,后来发现,效率太低的……低的可怜啊,于是开始选用Excel导出的CSV文件。从http://blog.csdn.net/znxf0702/article/details/42142045挖来了一段代码,但是存在一些不适用于被项目的问题。于是着手解决了两个主要问题1.CSV字符串换行的问题,2.第一个字段名有看不见的三个byte的问题。将代码分享出来,希望对大家有帮助
ChangeLog:
1.加入数字检测,现在能够转换为数字的都会以数字的形式存储
--[[------------------------------------------------- CsvLoader.lua Created by ArcherPeng on 15-03-18.-------------------------------------------------功能概述:本模块用于读取Excel导出的CSV文件,将读取的结果保存在一个table中本模块支持换行功能,但需要特殊标记在字符串开头加入#rrr表示开启换行,之后每加入一个#rrr则会换一次例如:#rrr普通副本#rrr挑战副本#rrr挂机副本#rrr日常副本#rrr结果为“普通副本挑战副本挂机副本日常副本”loadCsvFile(filePath,indexTitle)filePath 文件的路径indexTitle 作为teble的Key的字段-------------------------------------------------示例代码:--test1local testarr = loadCsvFile("data/test.csv")for k,v in pairs(testarr[1]) do print(k,v)end--test2local testarr = loadCsvFile("data/test.csv","EquieID")for k,v in pairs(testarr[1]) do print(k,v)end--]]_csv_log = function(...) print(string.format(...))endfunction split(str, reps) local resultStrsList = {}; string.gsub(str, '[^' .. reps ..']+', function(w) table.insert(resultStrsList, w) end ); return resultStrsList;endlocal function getRowContent(file) local content; local check = false local count = 0 while true do local t = file:read() if not t then if count == 0 then check = true end break end if not content then content = t else content = content..t end local i = 1 while true do local index = string.find(t, "\"", i) if not index then break end i = index + 1 count = count + 1 end if count % 2 == 0 then check = true break end end if not check then assert(1~=1) end return content and (string.trim(content))end--处理str是否需要换行,在字符串前加#rrr表示开启换行,然后所有需要换行的地方加入#rrrlocal function dealStr(str)if type(str) ~= "string" then return strendlocal keyWord = string.sub(str,1,4)if keyWord ~= "#rrr" thenreturn strend str = string.sub(str,5)local strArr = string.split(str,"#rrr")return table.concat(strArr,"\n")endfunction loadCsvFile(filePath,indexTitle) if not filePath then return end filePath = cc.FileUtils:getInstance():fullPathForFilename(filePath) local alls = {} local file = io.open(filePath, "r") while true do local line = getRowContent(file) if not line then break end table.insert(alls, line) end local titles = split(alls[1], ",") for k,v in pairs(titles) do if string.utf8len(titles[k]) ~= string.len(titles[k]) then _csv_log("修正前:titles["..k.."] "..titles[k].." "..string.utf8len(titles[k]).." "..string.len(titles[k])) titles[k] = string.sub(titles[k],string.len(titles[k]) - string.utf8len(titles[k]) + 2) _csv_log("修正后:titles["..k.."] "..titles[k].." "..string.utf8len(titles[k]).." "..string.len(titles[k])) end end local ID = 1 local arrs = {} for i = 2, #alls, 1 do local content = split(alls[i], ",") local tabelArrs = {} local index local flg = false for j = 1, #titles, 1 do tabelArrs[titles[j]] = tonumber(content[j]) or dealStr(content[j]) -- print("titles[j] "..titles[j].." "..string.utf8len(titles[j]).." "..string.len(titles[j])) if indexTitle and indexTitle == titles[j] then index = tonumber(content[j]) or content[j] flg = true end end if flg then arrs[index] = tabelArrs else arrs[ID] = tabelArrs end ID = ID + 1 end return arrsend_G.APUtils = _G.APUtils or {}_G.APUtils.LoadCsv = _G.APUtils.loadCsvFile or loadCsvFile
1 0
- [寒江孤叶丶的Cocos2d-x之旅_24]Cocos2d-x LUA 解析 Csv文件的方法
- [寒江孤叶丶的Cocos2d-x之旅_16]Cocos2d-x LUA脚本中解析Json的方法
- [寒江孤叶丶的Cocos2d-x之旅_23]Cocos2d-x LUA实现事件分发器 lua EventDispatcher
- cocos2d-x(quick-lua)读取csv文件
- [寒江孤叶丶的Cocos2d-x之旅_27]CocoStudio导出的LUA文件怎么使用?
- [寒江孤叶丶的Cocos2d-x之旅_37]获取LUA的父类方法
- [寒江孤叶丶的Cocos2d-x之旅_26]重大喜讯!CocoStudio终于支持导出LUA文件了!
- [寒江孤叶丶的Cocos2d-x之旅_35]在Cocos2d-Lua中使用ProtoBuf (Xcode配置方法)
- Cocos2d-x Lua 读取Csv文件,更方便的使用数据
- quick cocos2d-x lua解析json文件
- Cocos2d-x C++解析CSV
- cocos2d-x 的lua继承
- cocos2d-x的lua绑定
- 【Cocos2d-x lua篇003】简单解析Lua的堆栈
- cocos2d-x读取并解析json文件的方法[CSJson]
- [寒江孤叶丶的Cocos2d-x之旅_13]Cocos2d-x 3.2版本以上LUA脚本加密解决方案【12.19更新】
- [寒江孤叶丶的Cocos2d-x之旅_14]Cocos2d-x 3.2版本以上LUA脚本Socket通讯解决方案——LuaSocket
- [寒江孤叶丶的Cocos2d-x之旅_17]Cocos2d-x 3.2版本以上LUA脚本热更新(动态更新)解决方案
- Codeforces Round #296 (Div. 2) C - Glass Carving(STL运用)
- 关于512个实数点做DFT,频域保留257个点的理解
- UEditor设置语言
- 集合的列举和对比
- android JNI层读取assets目录文件
- [寒江孤叶丶的Cocos2d-x之旅_24]Cocos2d-x LUA 解析 Csv文件的方法
- 经典基础面试题
- eclipse的js文件中汉字是乱码怎么解决,更改eclipse的编码方式
- linux grep命令详解
- 输入并重复打印计算行数
- NYOJ 525 一道水题
- HDU - 5000 Clone DP
- Vi编辑器的基本使用方法
- LeetCode--Combination Sum(DFS)