【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