2010-04-13 103 views
4

我有一个报告,我需要解析/抓取加载到备用或可查询的数据存储。解析报告的最佳工具

该报告看起来像类似于:this

我的直觉是,PERL会做一份体面的工作,但我有几个不同的报告排列,我并不想在每个表格上都做一个脚本。

这份报告是一份漂亮的股票类型报告,我已经看到Monarch Pro可以解析这些类型的报告,但是我很难找到替代方法来解析这些问题,因为我期望这样做主要在Linux环境中工作。

有什么建议吗?

+0

您是否曾经为您的需求决定过一种解决方案? – 2014-09-22 22:59:11

回答

0

Perl确实会做一份体面的工作。 awk脚本可能会更快,但语法可能不太明确(虽然与perl相比,也许这是不公平的)。

+0

awk的语法比Perl更清晰。 – ghostdog74 2010-04-13 23:44:23

2

你也可以使用Python。它具有更清晰的语法,并且更易于编程。

2

Gawk会更好,它具有固定宽度字段的特定支持。 (查找FIELDWIDTHS变量。)

编写简单的规则来筛选出您将得到的垃圾也很容易。

这里有一个简单的脚本,只是给你从这份报告的“重要”线和可变映射您链接到:

BEGIN { 
    FIELDWIDTHS="4 4 7 5 1 7 1 1 23 4 10 2 1 2 8 1 6 1 4 1 6 1 2 1 2 1 2 1 4 2 10 1" 
} 

function cvt_amt(a) { 
    gsub(",", "", a); 
    amt = a * 1; 
    return amt; 
} 

function empty(s) { 
    gsub(" ", "", s); 
    return s == ""; 
} 

/* skip garbage lines */ 
/----/ { next; } 
/CASH RECEIPTS REPORT/ { next;} 
/PERIOD ENTERED/ { next; } 
/^ *$/ { next; } 

($2 == "CUST") { next; } 
($2 == "NO. ") { next; } 
/CUSTOMER TOTALS/ { next; } 
/GRAND TOTALS/ { next; } 
/SUMMARY BY STATUS/ { nextfile; } /* end of stuff we care about */ 

/* Identify user */ 
(!empty($2)) { 
    user_no = $2; 
    user_name = substr($0, 10, 30); 
} 

{ 
    /* variable mapping */ 
    cust_no = $2; 
    vchr_no = $4; 
    inv_no = $6; 
    inv_no_sign = $7; 
    inv_desc = $9; 
    recv_amt = cvt_amt($11); 
    st = $13; 
    recv_date = $15; 
    check_no = $17; 
    period = $19; 
    batch = $21; 
    bank = $23; 
    cc = $25; 
    dp = $27; 
    acct = $29; 
    amt_recv = cvt_amt($31); 
    sign = $32; 
    if (sign == "-") { 
     amt_recv = amt_recv * -1; 
    } 

    print; 
} 

坦率地说,我觉得这是很干净,但我是一个( g)awk fanboi。

编辑 - 我添加了一些代码来提取用户号码和名称。用户编号是来自固定字段的字段2,但用户名必须由substr()输出,因为它与许多细节字段重叠。

+0

您可以通过使用替换合并所有具有“下一步”动作的正则表达式:>'/ ---- | CUSTOMER TOTALS | GRAND TOTALS | PERIOD ENTERED | .../{next}' – ghostdog74 2010-04-14 03:38:28

+0

当我运行脚本时,得到相关的产品线,但我想要做的一件事就是在所有相关产品线(1000比尔供应公司和1200票据计算机)上复制帐户#和名称。那可能发生? – 2010-04-15 09:52:29