这里是将一个csv的表导入到数据库中,用lua解析

1 篇文章 0 订阅
print(os.date())
--dofile("C:/Program Files (x86)/Lua/lua_script/sql_str.lua") 

local ss = "tblTreasureInfo"

local file = "I:/PlanJ_SS/SS_Server/dbcsv/ssdbGame/" .. ss ..".csv"


local sql_del = "delete from "..ss

local result_ = "QA已导好表,执行文件  " .. ss .."  成功!!!!"

local Zi_duan = {}

local sql_Str = nil 




function getTpl0(tname)     -- 获取表各个字段

	
	local t = {}
	table.insert(t, Zi_duan)
    for k, v in ipairs(t) do
        if k == 1 then
            return t[k]    --返回一个table
        end
    end
end

--以上的功能,可以打印第一条数据的字段



function LoadCSV(filePath)

    -- Load File

        local file = assert(io.open(filePath, 'r'))
        local content = file:read("*all")
        file:close()

    -- Read Word One By One

        local c         = content -- content
        local p         = 0       -- content check pos
        local w         = ""      -- content check word
        local w_next    = ""      -- content check word(next one)
        local x         = 1       -- content table x
        local y         = 1       -- content table y
        
        local opt       = {}      -- output table
              opt[y]    = {}
              opt[y][x] = ""

        local in_quote  = false   -- quote mode

        while true do
            p      = p + 1
            w      = string.sub(c,p  ,p  )
            w_next = string.sub(c,p+1,p+1)
            if w == ',' then
                if in_quote then
                    opt[y][x] = opt[y][x]..w
                else
                    x = x + 1
                    opt[y][x] = ""
                end
            elseif w == '"' then
                if in_quote then
                    if w_next == '"' then
                        opt[y][x] = opt[y][x]..w
                        p = p + 1
                    else
                        in_quote = false
                    end
                else
                    in_quote = true
                end
            elseif w == '\n' then
                if in_quote then
                    opt[y][x] = opt[y][x]..w
                else
                    y = y + 1
                    x = 1
                    opt[y] = {}
                    opt[y][x] = ""
                end
            elseif w == "" or w == nil then
                opt[y][x] = nil
                break
            else
                opt[y][x] = opt[y][x]..w
            end
        end

    -- Return Table

        return opt

end

    local csvData = LoadCSV(file)

    for k,v in pairs(csvData) do
		--local result = table.concat(v)
		--print(result)
		if k == 1 then
			for k2,v2 in pairs(v) do
				if k == 1 then 
					--print(k.."===="..k2.."---》"..v2)
					table.insert(Zi_duan, v2)
				end
			end
			table.remove(csvData, 1)
			break;
			
		else
		end
    end
	
	
	
	
	
	
--[[
    for k,v in pairs(csvData) do
		
		

			for k2,v2 in pairs(v) do
				
					table.insert(t_tt[k], v2)
					
				
			end 
    end
	
--]]


function createInsertSql(tname, tpl)   --插入一个文件名和一个table
    local tpl0 = getTpl0(tname)     -- 获取表各个字段
    local ret = {}                  -- 插入记录sql
 
    table.insert(ret, string.format("insert into `%s`(", tname))
    for k, v in pairs(tpl0) do
        if k > 1 then
            table.insert(ret, ",")
        end
        table.insert(ret, "`")
        table.insert(ret, v)
		table.insert(ret, "`")
    end
	table.insert(ret, ") values ")
	local result = table.concat(ret)    -- 最终的sql语句
	--insert into `tpl_pack`(`packId`,`itemId`,``group``,`num`,`rate`,`rateType`) values 
	print(result)
	
	
    for k, v in pairs(tpl) do         --解析一个table
		if k <= (#tpl-1) then
        if k > 1 then
            table.insert(ret, ",")
        end
        table.insert(ret, "(")
        for k2, v2 in pairs(v) do
            if k2 > 1 then
                table.insert(ret, ",")
            end
            if v2 == "nil_1" then
                table.insert(ret, "'")
				table.insert(ret, "'")
				
			elseif type(v2) == "string" then
				table.insert(ret, string.format("'%s'", v2))
            else
				table.insert(ret, "'")
                table.insert(ret, v2)
				table.insert(ret, "'")
            end
        end
        table.insert(ret, ")")
		end
    end
    table.insert(ret, ";")
 
    local result = table.concat(ret)    -- 最终的sql语句
	
	sql_Str = result
    print(result)
	--print(result_)
    --print()
end


createInsertSql(ss, csvData)   --这里写上路径和文件名








--执行数据库
require"luasql.mysql"   --创建环境对象   
env=luasql.mysql()    --连接数据库   
--conn=env:connect("wuxinchang","root","root","127.0.0.1",3306)    --设置数据库的编码格式   
conn=env:connect("ssdbGame","derek","derek123","192.168.3.236",3306)    --设置数据库的编码格式   
--conn:execute"SET NAMES UTF8"   --执行数据库操作
conn:execute"SET NAMES GB2312"   --执行数据库操作   
     
status,errorString = conn:execute(sql_del)  
  
  
status,errorString = conn:execute(sql_Str)   


 

  
if errorString == nil then  
	print(result_)
    return 1;  
else  
    print(status,errorString )  
end   


  
conn:close()--关闭数据库连接   
env:close()--关闭数据库环境  
--dofile("C:/Program Files (x86)/Lua/lua_script/sql_str.lua") 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值