记录下第一次用lua

因为项目需要,最近开始接触lua,需求倒是很简单,策划给出一张csv表,第一列是属性,第二列是概率,让找出四个不同的属性。


使用链表的做法


function GetLines(fileName)
    indx = 0
    myLines = {}
    for line in io.lines(string.format("%s%s", "./", fileName)) do
        indx = indx + 1
        myLines[indx] = line
    end
    return indx, myLines
end



function GetValues(myString)
    local num = 0
    local values = {}
    if myString ~= nil then
        while string.find(myString,",") ~= nil do
            i,j = string.find(myString,",")
            num = num + 1
            values[num] = string.sub(myString,1, j-1)
            myString = string.sub(myString, j+1, string.len(myString))
        end
        num = num + 1
        values[num] = myString
    end
    return num, values
end


function ReadCsv(fileName, list)

	local all_num = 0
	local index = 1

	zt_v = {["name"]="HEAD", ["data"]=tonumber(0)}
	list = {next=list, value=zt_v}

	local _, myLines = GetLines(fileName)
	for k,v in ipairs(myLines) do
		if k>1  then
			local _, values = GetValues(v)
			local n_v2 = tonumber(values[2]) * 100

			t_v = {["name"]=values[1], ["data"]=n_v2}
			list ={next=list, value=t_v}

			all_num = all_num + n_v2
		end
	end

	return all_num, list
end

function p_table(tb)
	for _,k in pairs(tb) do
		print(_, k)
	end
end

function p_list(list)
	local l = list

	while l do
		if l ~= nil and l.next ~= nil then
			print(l.value["name"], l.value["data"])
		end

		l = l.next
	end

end


function GetValue(num, list)
	local addlen = 0
	local l = list

	while l do
		if l ~= nil and l.next ~= nil and l.next.next ~= nil then

			local right = addlen + l.next.value["data"]

			if  num > addlen and num <= right then
				local getName, getValue = l.next.value["name"], l.next.value["data"]

				l.next = l.next.next;

				return getName, getValue
			end

			addlen = right
		end


		l = l.next

	end
end

---------------------------------------------------------------------


local list = {}
local all_num, list = ReadCsv("data.csv", list)

print("-------------------")
print(all_num)
p_list(list)
print("-------------------")

math.randomseed(tostring(os.time()):reverse():sub(1, 6))
for l=1,4,1 do
	local rand = math.random(all_num)
	local getName, getValue = GetValue(rand, list)
	all_num = all_num - getValue

	print("---------------")
	--print(all_num)
	print("["..getName..", "..getValue.."]")
	print("---------------")
	p_list(list)

end


简单点,直接使用table


function GetLines(fileName)
    indx = 0
    myLines = {}
    for line in io.lines(string.format("%s%s", "./", fileName)) do
        indx = indx + 1
        myLines[indx] = line
    end
    return indx, myLines
end



function GetValues(myString)
    local num = 0
    local values = {}
    if myString ~= nil then
        while string.find(myString,",") ~= nil do
            i,j = string.find(myString,",")
            num = num + 1
            values[num] = string.sub(myString,1, j-1)
            myString = string.sub(myString, j+1, string.len(myString))
        end
        num = num + 1
        values[num] = myString
    end
    return num, values
end


function ReadCsv(fileName)

	local all_num = 0
	local index = 1

	local v_table = {}

	local _, myLines = GetLines(fileName)
	for k,v in ipairs(myLines) do
		if k>1  then
			local _, values = GetValues(v)
			local n_v2 = tonumber(values[2]) * 100

			v_table[values[1]] = n_v2

			all_num = all_num + n_v2
		end
	end

	return all_num, v_table
end

function p_table(tb)
	for _,k in pairs(tb) do
		print(_, k)
	end
end

function p_list(list)
	local l = list

	while l do
		if l ~= nil and l.next ~= nil then
			print(l.value["name"], l.value["data"])
		end

		l = l.next
	end

end

function GetValue(num, v_table)
	local left = 0
	local right = left

	local i = 1
	for k,v in pairs(v_table) do
		right = right + v

		if num > left and num <= right then
			local gName = k
			local gValue = v_table[k]

			v_table[k] = nil
			return gName, gValue
		end

		left = right
		i = i + 1
	end
end


---------------------------------------------------------------------


local all_num, v_table = ReadCsv("data.csv", list)

print("-------------------")
print(all_num)
print("-------------------")
p_table(v_table)



math.randomseed(tostring(os.time()):reverse():sub(1, 6))
for l=1,4,1 do
	local rand = math.random(all_num)
	local gName, gValue= GetValue(rand, v_table)

	print("--------------")
	p_table(v_table)
	print("--------------")

	all_num = all_num - gValue

	print("---------------")
	--print(all_num)
	print("["..gName..", "..gValue.."]")
	print("---------------")


end


使用正则处理字符串的


--[[
	正则处理,输入指定格式字符串,返回处理后的table
]]

function handleString(inputString)
	v_table = {}

	local str = inputString
	local header = string.match(str, "(%a+)|")
	table.insert(v_table, header)

	str = string.gsub(str, header.."|", "")
	local iteratorFunc = string.gmatch(str, "%a+=[^,^|]*")
	for var in iteratorFunc do
		local key, value = string.match(var, "(%a+)=([^,^|]*)")
		if value == nil then
			value = ""
		end

		v_table[key] = value
	end
	return v_table;
end


----------------------------------------------------

local inputString = "lgn|userid=50151910,tm=1476326691,sign=d6a6b92a41c39d86985057123611ee7b,ver=0.0.0.5.4842,ch=9876567,account=,svrid=qmsj0001,deviceid=,channeluser=0,sdkver=,devicemodel=,oriuid=1775564699352569,vip_xinyue=-1"

g_table = handleString(inputString)

for k,v in pairs(g_table) do
	print(k, v)
end


猜你喜欢

转载自blog.csdn.net/adofsauron/article/details/53079164