Parsing 解析报告的最佳工具

Parsing 解析报告的最佳工具,parsing,report,Parsing,Report,我有一个报告,需要对其进行解析/刮取,以便加载到备用或可查询的数据存储中 该报告类似于: 我的直觉是PERL会做得很好,但我有几种不同的报告排列,我真的不想围绕每个表单编写脚本 这个报告是一个非常棒的股票类型的报告,我已经看到了Monator Pro可以解析这些类型的报告的地方,但是我很难找到解析这些类型报告的替代方法,因为我希望主要在Linux环境中完成这项工作 有什么建议吗?Perl确实可以做得很好。awk脚本可能更快,但语法可能不够清晰(尽管与perl相比,这可能不公平)。您也可以使用Py

我有一个报告,需要对其进行解析/刮取,以便加载到备用或可查询的数据存储中

该报告类似于:

我的直觉是PERL会做得很好,但我有几种不同的报告排列,我真的不想围绕每个表单编写脚本

这个报告是一个非常棒的股票类型的报告,我已经看到了Monator Pro可以解析这些类型的报告的地方,但是我很难找到解析这些类型报告的替代方法,因为我希望主要在Linux环境中完成这项工作


有什么建议吗?

Perl确实可以做得很好。awk脚本可能更快,但语法可能不够清晰(尽管与perl相比,这可能不公平)。

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

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


编辑——我添加了一些代码来提取用户名和用户名。User number是固定字段中的字段2,但是用户名必须substr()out,因为它与许多细节字段重叠。

您可以使用替换组合所有具有“next”操作的正则表达式:>
/----客户总数|总计|输入的期间|…/{next}
运行脚本时,我会得到相关行,但我想做的一件事是在所有相关行(1000比尔的供应公司和1200比尔的计算机)上复制一个账户和名称的行…关于如何实现这一点有什么建议吗?你有没有根据自己的需要决定过一种解决方案?