1.前言
這是一個(gè)非常不通用的導(dǎo)入導(dǎo)出!梗顺!(先給自己挖個(gè)坑以后再補(bǔ)成通用)
為了避免導(dǎo)入過于復(fù)雜惰说,所以我將table里的嵌套table都轉(zhuǎn)為一行數(shù)據(jù)
適用場景:
嵌套的table的value可以都存在同一行(最好不要有太多嵌套撕蔼!不然會越來越復(fù)雜)窿吩,在導(dǎo)入方法里杨蛋,你必須明確哪幾個(gè)值是屬于哪個(gè)key的值兜材。比如我的存法是將pos的x,y,z都存在前三個(gè),因?yàn)槲业腸hild這個(gè)table里的值的個(gè)數(shù)是不確定的逞力,這樣可以方便后面我取數(shù)據(jù)
OS:如果你想要將table原原本本導(dǎo)出來放在文件里曙寡,用dump就行了,但是這樣導(dǎo)入就很痛苦
2.導(dǎo)出函數(shù)
這個(gè)還可以改進(jìn)寇荧,可以用迭代+for循環(huán)來實(shí)現(xiàn)(具體可參考dump的寫法举庶,過幾天我再改進(jìn)),下面我的實(shí)現(xiàn)僅適用于兩層table
--導(dǎo)出節(jié)點(diǎn)數(shù)據(jù)
local timeStr = os.date("%Y-%m-%d %H:%M:%S", os.time()) --TODO:time進(jìn)行轉(zhuǎn)換 --%x
local path = "路徑"
local fileName = "文件名"
local file = io.open(path .. fileName, "w+")
file:write("你想寫的備注:" .. timeStr .. "\n".."--posX,posY,posZ,child1,child2.....\n")
for k,v in pairs(self.currentArray) do
local strLine = nil
strLine = "[\""..k.."\"] = "
strLine = strLine..string.format("{%.2f,%.2f,%d", v.pos.posX, v.pos.posY, v.pos.posZ)
for key,value in ipairs(v.child) do
strLine = strLine..string.format(",%s",value)
end
file:write(strLine.."}\n")
end
file:flush()
file:close()
3.導(dǎo)入函數(shù)
因?yàn)槊恳恍械膙alue是通過逗號隔開揩抡,所以取數(shù)據(jù)就需要分隔字符串了户侥,lua沒有函數(shù)镀琉,只能自己動手寫了(這里給function可以傳入一個(gè)符號,那就可以實(shí)現(xiàn)傳入空格或者其他符號都可以截取)
--截取以逗號分隔的字符串
local splitStr = function (str)
local strTable = {}
local j = 1
while string.find(str,",",j) do
local i = string.find(str,",",j)
table.insert(strTable,string.sub(str,j,i-1))
j = i + 1
end
table.insert(strTable,string.sub(str,j))
return strTable
end
local fileName = "文件名"
--讀取文件
local path = "路徑"
local readFile = io.open(path .. fileName,"r")
local readLine = nil
local curTemp = {}
for readLine in readFile:lines() do
local beginKeyIdx = string.find(readLine,"%[")
local endKeyIdx = string.find(readLine,"%]")
if beginKeyIdx~=nil and endKeyIdx~=nil then
--此時(shí)獲得每行的key
local idx = string.sub(readLine,beginKeyIdx+2,endKeyIdx-2)
curTemp[idx]={pos = {posX = 0 ,posY = 0 ,posZ = 0} , child = {}}
local beginValueIdx = string.find(readLine,"{")
local endValueIdx = string.find(readLine,"}")
if beginValueIdx~=nil and endValueIdx~=nil then
--此時(shí)獲得每行的value
local stringAllPos = string.sub(readLine,beginValueIdx+1,endValueIdx-1)
local values = splitStr(stringAllPos)
curTemp[idx].pos.posX = tonumber(values[1])
curTemp[idx].pos.posY = tonumber(values[2])
curTemp[idx].pos.posZ = tonumber(values[3])
local curValuesIdx = 3
while curValuesIdx< #stringAllPos do
curValuesIdx = curValuesIdx + 1
table.insert(curTemp[idx].child,values[curValuesIdx])
end
end
end
end