最佳工具用于解析报告。

4
我有一个报告需要解析/抓取,以便加载到备用或可查询的数据存储中。
报告看起来像是这样的: this
我的直觉是PERL会做得很好,但我有几个不同的报告变体,我不想为每种形式编写脚本。
这份报告是一份相当普通的报告,我已经看到过Monarch Pro可以解析这些类型的报告,但我很难找到其他替代方案,因为我主要在Linux环境中工作。
有什么建议吗?

你最终决定采用哪种方案来满足你的需求了吗? - Mario Tacke
3个回答

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的粉丝。
编辑--我添加了一些代码以提取用户编号和名称。用户号码是从固定字段中的第2个字段获取,但是用户名称必须使用substr()方法获取,因为它与许多详细字段重叠。

你可以通过使用交替符号将所有具有“next”操作的正则表达式组合起来:> /----|CUSTOMER TOTALS|GRAND TOTALS|PERIOD ENTERED|.../{next} - ghostdog74
当我运行你的脚本时,我得到了相关的行,但我想做的一件事是将帐号#和名称在所有相关行上复制(1000 Bill's Supply Co和1200 Bills' Computer)...有什么建议吗? - Andy Schaefer

2

你也可以使用Python。它的语法更加简洁,编程起来更容易。


0

Perl确实可以胜任。awk脚本可能更快,但语法可能不太清晰(尽管与perl相比,这可能是不公平的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接