技术开发 频道

Lua 报表应用一列

  【IT168 技术文档】我也不知道同事的抽取程序写得有什么问题,毕竟Java我不太懂. 几张报表要运算上一个多小时,我用lua试了一把,嘿嘿,总共不到两分钟。总体感觉lua的table实在是强大,整个报表数据来源于几个文件,由lua处理并进行合并.拿其中一张生成报表的代码示例

  #!/usr/bin/lua   --* DESCRIPTION : 统计生成卡日报表   --* CREATE BY : pinge in 09/30/2005   --* C printf   function printf(fmt, ...)   fmt = string.format(fmt, unpack(arg))   io.write(fmt);   end   --* C fprintf   function fprintf(fp, fmt, ...)   fmt = string.format(fmt, unpack(arg))   fp:write(fmt);   end   --* 按分隔符拆分数据   function split(lines, deli)   local t = {}   local idx = 1;   pattern = "[^"..deli.."]+"   for columes in string.gfind(lines, pattern)   do   t[idx] = columes;   idx = idx + 1;   end   return idx, t   end   --* 初始报表数据   function init_ab_data()   return {   last_bal = 0.0, -- 期初余额   cash_debit_cnt = 0, -- 现金借笔数   cash_debit_amt = 0.0, -- 现金借发生   cash_credit_cnt = 0, -- 现金贷笔数   cash_credit_amt = 0.0, -- 现金贷笔数   tfr_debit_cnt = 0, -- 转帐借笔数   tfr_debit_amt = 0.0, -- 转帐借发生   tfr_credit_cnt = 0, -- 转帐贷笔数   tfr_credit_amt = 0.0, -- 转帐贷发生   ap_cad_cnt = 0, -- 折申请卡笔数   ap_cad_amt = 0.0, -- 折申请卡发生   dp_cad_cnt = 0, -- 销卡笔数   dp_cad_amt = 0.0, -- 销卡发生   end_bal = 0.0 -- 期末余额   };   end   --* 获取机构/卡种当日期末余额   function calc_bal_report(t)   local rec = REPORT[t[2]]   if rec == nil then   REPORT[t[2]] = {}   rec = REPORT[t[2]]   end   res = rec[t[1]]   if res == nil then   rec[t[1]] = init_ab_data()   res = rec[t[1]]   end   res.end_bal = tonumber(t[3])   end   --* 获取机构/卡种期初余额   function calc_fbal_report(t)   local rec = REPORT[t[2]]   if rec == nil then   REPORT[t[2]] = {}   rec = REPORT[t[2]]   end   res = rec[t[1]]   if res == nil then   rec[t[1]] = init_ab_data()   res = rec[t[1]]   end   res.last_bal = tonumber(t[3])   end   --* 根据分录流水帐统计当日卡借贷发生(分现金/转帐)   function calc_happen_report(t)   local rec = REPORT[t[2]]   if rec == nil then   REPORT[t[2]] = {}   rec = REPORT[t[2]]   end   res = rec[t[1]]   if res == nil then   rec[t[1]] = init_ab_data()   res = rec[t[1]]   end   local count = tonumber(t[5])   local amt = tonumber(t[6])   if tonumber(t[3]) == 1 then -- "交易类别:01 现金"   if t[4] == "1" then -- 借方发生   res.cash_debit_cnt = res.cash_debit_cnt + count;   res.cash_debit_amt = res.cash_debit_amt + amt;   elseif t[4] == "2" then   res.cash_credit_cnt = res.cash_credit_cnt + count;   res.cash_credit_amt = res.cash_credit_amt + amt;   end   else   if t[4] == "1" then -- 借方发生   res.tfr_debit_cnt = res.tfr_debit_cnt + count;   res.tfr_debit_amt = res.tfr_debit_amt + amt;   elseif t[4] == "2" then   res.tfr_credit_cnt = res.tfr_credit_cnt + count;   res.tfr_credit_amt = res.tfr_credit_amt + amt;   end   end   end   --* 根据销配卡折登记簿统计销配卡对余额影响数据   function calc_xp_report(t)   local rec = REPORT[t[2]]   if rec == nil then   REPORT[t[2]] = {}   rec = REPORT[t[2]]   end   local res = rec[t[1]]   if res == nil then   rec[t[1]] = init_ab_data()   res = rec[t[1]]   end   local count = tonumber(t[4])   local amt = tonumber(t[5])   if t[3] == "1" then -- 配卡   res.ap_cad_cnt = res.ap_cad_cnt + count;   res.ap_cad_amt = res.ap_cad_amt + amt;   elseif t[3] == "2" then -- 仅销卡   res.dp_cad_cnt = res.dp_cad_cnt + count;   res.dp_cad_amt = res.dp_cad_amt + amt;   end   end   function process(report_func, fname)   local fp = assert(io.open(fname, "r"))   for lines in fp:lines()   do   t = {}   num, t = split(lines, "|")   report_func(t)   end   fp:close()   return num   end   arg = arg or {}   if table.getn(arg) < 1 then   io.write("\tusage:ab_report.lua \n")   os.exit(1)   else   REPORT = {}   process(calc_bal_report, "ab_bal.txt") -- 期末余额   process(calc_happen_report, "ab_hap.txt") -- 当日发生   process(calc_xp_report, "ab_add.txt") -- 销配卡   process(calc_fbal_report, "ab_l_bal.txt") -- 期初余额   fp = assert(io.open("ab_report.txt", "w"))   for cadp, bran in pairs(REPORT) do   for item, val in pairs(bran) do   fprintf(fp, "%s|%s|%s|", arg[1], cadp, item)   fprintf(fp, "%.2f|", val.last_bal)   fprintf(fp, "%d|%.2f|", val.cash_credit_cnt, val.cash_credit_amt)   fprintf(fp, "%d|%.2f|", val.cash_debit_cnt, val.cash_debit_cnt)   fprintf(fp, "%d|%.2f|", val.tfr_debit_cnt, val.tfr_debit_cnt)   fprintf(fp, "%d|%.2f|", val.tfr_credit_cnt, val.tfr_credit_amt)   fprintf(fp, "%d|%.2f|", val.ap_cad_cnt, val.ap_cad_amt)   fprintf(fp, "%d|%.2f|", val.dp_cad_cnt, val.dp_cad_amt)   fprintf(fp, "%.2f|", val.end_bal)   fprintf(fp, "\n")   end   end   fp:close()   os.remove("ab_bal.txt")   os.remove("ab_l_bal.txt")   os.remove("ab_hap.txt")   os.remove("ab_add.txt")   os.exit(0)   end
0
相关文章