Лучшие инструменты для разбора отчетов - PullRequest
4 голосов
/ 13 апреля 2010

У меня есть отчет, который мне нужно проанализировать / очистить для загрузки в альтернативное или запрашиваемое хранилище данных.

Отчет выглядит примерно так: это .

Моя интуиция заключается в том, что PERL справился бы достойно, но у меня есть несколько различных вариантов отчета, и я не хочу создавать сценарий для каждой формы.

Этот отчет довольно симпатичный, и я видел, как Monarch Pro может анализировать эти типы отчетов, но мне было трудно найти альтернативы тому, как их можно анализировать, так как я собираюсь сделать это прежде всего в среде Linux.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

вы также можете использовать Python. Он имеет более чистый синтаксис и его легче программировать.

2 голосов
/ 14 апреля 2010

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 голосов
/ 13 апреля 2010

Perl действительно сделал бы достойную работу. Скрипт awk может быть быстрее, но синтаксис может быть не совсем понятным (хотя по сравнению с perl, возможно, это нечестно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...