2010-04-13 6 views
4

J'ai un rapport que j'ai besoin d'analyser/gratter pour le chargement dans un magasin de données alternatif ou à requête.Meilleurs outils pour analyser les rapports

Le rapport ressemble à quelque chose ressemblant à: this. Mon instinct est que PERL ferait un travail décent, mais j'ai plusieurs permutations différentes du rapport et je ne veux pas vraiment faire un script autour de chaque formulaire. Ce rapport est un joli type de rapport, et j'ai vu où Monarch Pro peut analyser ces types de rapports, mais j'ai eu du mal à trouver des alternatives à la façon dont ils pourraient être analysés depuis que je cherche à le faire. travaillant principalement dans un environnement Linux.

Des suggestions?

+0

Avez-vous déjà choisi une solution pour vos besoins? –

Répondre

0

Perl ferait en effet un travail décent. Un script awk peut être plus rapide mais la syntaxe peut être moins claire (bien que comparée à perl, c'est peut-être injuste).

+0

La syntaxe d'awk est beaucoup plus claire que celle de Perl. – ghostdog74

2

vous pouvez également utiliser Python. Il a une syntaxe plus propre et est plus facile à programmer.

2

Gawk serait mieux, avec son support spécifique pour les champs de largeur fixe. (Recherchez la variable FIELDWIDTHS.)

Il est également facile d'écrire les règles simples pour filtrer les déchets que vous obtiendrez.

Voici un script simple qui vous donne juste les « importants » lignes et les correspondances variables de ce rapport que vous avez lié à:

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; 
} 

Franchement, je pense que cela est assez propre, mais je suis un (g) awb fanboi. Editer - J'ai ajouté du code pour extraire le numéro et le nom de l'utilisateur. Le numéro d'utilisateur est le champ 2 à partir des champs fixes, mais le nom d'utilisateur a fallu substr() out, car il chevauche de nombreux champs de détail.

+0

vous pouvez combiner tous vos regex qui ont "prochaine" action en utilisant l'alternance:> '/ ---- | TOTALS CLIENT | GRAND TOTALS | PÉRIODE ENTRÉE | .../{next}' – ghostdog74

+0

Lorsque je lance votre script, je obtenir les lignes pertinentes, mais une chose que je veux faire est net sur une ligne qui a le numéro de compte et le nom répliqué sur toutes les lignes pertinentes (1000 Bill's Supply Co et 1200 Bills 'Computer) .... des suggestions sur la façon dont cela pourrait arriver? –

Questions connexes