原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的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)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 str end local keyWord = string.sub(str,1,4) if keyWord ~= "#rrr" then return str end 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总结
以上是内存溢出为你收集整理的[寒江孤叶丶的Cocos2d-x之旅_24]Cocos2d-x LUA 解析 Csv文件的方法全部内容,希望文章能够帮你解决[寒江孤叶丶的Cocos2d-x之旅_24]Cocos2d-x LUA 解析 Csv文件的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)