lua遍歷文件夾
發布時間: 2024-08-27 09:22:41
㈠ LUA 關於取出兩個table中不同元素的演算法。
【我理解下你的意思
你是要把 T_letter_tbl 中所有元素的 letter標簽和 和 hope_letter_tbl 中的元素比較,如果 發現重復 的 則刪除 T_letter_tbl 中的 重復標簽嗎?
【一般做法】用 lua 做這種很容易,但是要注意方法,不是比較,那樣遍歷比較 效率太低。先把 需要比較的 table 的元素作為 索引 建立一個 hash
直接取元素 進行 標簽判斷,
下面是一個演示:table.print 自定義的輸出,可以刪去,自己選擇輸出方式
functiontable.print(tbl,name)
name=nameor"table"
localprompt=''
locali=1
localprinted={}
localfunctiontostring2(var)
if(type(var)=="string")then
return'"'..var..'"'
end
returntostring(var)
end
localfunctionitor(t,i)
printed[tostring(t)]=true;
forkey,eleinpairs(t)do
ifnot(type(ele)=="table")then
print(string.format('%s[%s]=%s;',string.rep(prompt,i),tostring2(key),tostring2(ele)))
elseifprinted[tostring(ele)]then
print(string.format('%s[%s]=%s;',string.rep(prompt,i),tostring2(key),tostring2(ele)))
else
print(string.format('%s[%s]={',string.rep(prompt,i),tostring2(key)))
i=i+1
itor(ele,i)
i=i-1
print(string.format('%s};',string.rep(prompt,i)))
end
end
end
print(string.format("%s={",name))
itor(tbl,i)
print("};")
end
-----------------------------------------------------
tbl_letter_HOPE={
[1]="bbbbbb";
[2]="ffffff";
[3]="cccccc";
[4]="xxxxxx";
[5]="eeeeee";
};
tbl_letter_T={
[1]={["letter"]="Y"};
[2]={["letter"]="M"};
[3]={["letter"]="P"};
[4]={["letter"]="K"};
[5]={["letter"]="bbbbbb"};
[6]={["letter"]="R"};
[7]={["letter"]="Q"};
[8]={["letter"]="xxxxxx"};
[9]={["letter"]="L"};
[10]={["letter"]="D"};
[11]={["letter"]="B"};
[12]={["letter"]="ffffff"};
[13]={["letter"]="Z"};
[14]={["letter"]="T"};
[15]={["letter"]="["};
[16]={["letter"]="cccccc"};
[17]={["letter"]="E"};
[18]={["letter"]="C"};
[19]={["letter"]="W"};
[20]={["letter"]="I"};
[21]={["letter"]="F"};
[22]={["letter"]="eeeeee"};
[23]={["letter"]="O"};
[24]={["letter"]="X"};
[25]={["letter"]="U"};
[26]={["letter"]="S"};
};
---根據tbl_letter_HOPE中的元素去除tbl_letter_T中的元素
--
localfunctionmain()
localtbl_erase={}
forkey,eleinpairs(tbl_letter_HOPE)do
--不考慮元素權重則改為=true
tbl_erase[tostring(ele)]=(tbl_erase[tostring(ele)]or0)+1
end
forkey,eleinpairs(tbl_letter_T)do
iftbl_erase[ele.letter]then
--移除整行[12]={["letter"]="ffffff"};
tbl_letter_T[key]=nil
--還是一個標簽letter
--tbl_letter_T[key].letter=nil
end
end
table.print(tbl_letter_T)
end
startTime=os.time()
main()
print(string.format(">>Thisfunctioncost:%sms",tostring(os.time()-startTime)))
【附】
如果只想 獲得去除給定元素後的 table
可以先 復制原 tbl_letter_T
注意:
不要用 淺復制 你之前 那個代碼 可能 就是 希望做一個 tbl_letter_T 的副本
但是 使用 淺復制相當於僅復制了指向table的句柄。
php">tbl_Interim=tbl_letter_T--2個變數指向同一個table表
要用
python">forkey,eleinpairs(tbl_letter_T)do
tbl_Interim[key]=ele
end
你可以參考如下實例代碼:
functiongetFile(file_name)
localf=assert(io.open(file_name,'r'))
localstring=f:read("*all")
f:close()
returnstring
endfunctionwriteFile(file_name,string)
localf=assert(io.open(file_name,'w'))
f:write(string)
f:close()
end--從命令行獲取參數,如果有參數則遍歷指定目錄,沒有參數遍歷當前目錄ifarg[1]~=nilthen
cmd="ls"..arg[1]
else
cmd="ls"endprint("cmd",cmd)
--io.popen返回的是一個FILE,跟c裡面的popen一樣locals=io.popen(cmd)
localfileLists=s:read("*all")
print(fileLists)
whiletruedo--從文件列表裡一行一行的獲取文件名_,end_pos,line=string.find(fileLists,"([^ ]+.txt)",start_pos)
ifnotend_posthenbreakend--print("wld",line)localstr=getFile(line)
--把每一行的末尾1,替換為0,localnew=string.gsub(str,"1, ","0, ");
--替換後的字元串寫入到文件。以前的內容會清空writeFile(line,new)
start_pos=end_pos+1end
熱點內容