The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

No::OCRData - Operate on OCRed data from Norwegian banks

SYNOPSIS

    use No::OCRData qw(parse reduce kid_hash);
    @data = reduce(parse(@d));
    print $data[21]{'SUM_BELOP'};
    %mykids = kid_hash(reduce(parse(@d)));
    print $mykids{'900969'}{'OPPGJORSDATO'}

DESCRIPTION

This documentation is written in Norwegian, for others, suffice to say that it does not really have much to do with Optical Character Recognition.

Denne modulen brukes til å parse og få ut noe fornuftig ut av filene som kommer fra Bankenes Betalingssentrals OCRGiro-tjeneste.

Denne dokumentasjonen, eller modulen for den saks skyld, vil ikke gi deg mye uten at du leser BBS sin spesifikasjon, som finnes på http://www.bbs.no/ocr/brukerhandboeker/ocrg_systemhandbok030601.pdf

Rutinene lager en hash av hashrefs eller array av hashrefs, der navnene på nøklene er de samme som i spesifikasjonen, med det unntak av mellomrom blir til '_' og ø blir til o. De er alle i store bokstaver.

Ingen av rutinene eksporteres implisitt. Du må be om dem. Rutinene er som følger:

parse(@arr)

Funksjonen parse() tar en array som inneholder innholdet i fila (som må leses inn som en array på vanlig måte hvis man faktisk leser fra fil). Den gjør grovarbeidet med å parse fila. Den returnerer en array med hashrefs, der nøklene er navnene fra spesifikasjonen som beskrevet over. 0-er som brukes til padding taes ikke med, men forøvrig gjør ikke parse() noe forsøk på å gjøre noe å gjøre noe med dataene. Se reduce().

reduce(@arr)

reduce() tar en array som har kommet fra parse() som input og prøver å gjøre en del nødvendige ting med den (astronomer har det med å kalle det denne rutinen gjør for "redusering av data"). Det anbefales at reduce() brukes umiddelbart etter parse(), men det kan jo tenkes at andre vil gjøre det på en annen måte. Den returner så en modifisert versjon av samme array. Disse forandringene gjøres av reduce():

  • Sletter det overflødige FORMATKODE-feltet.

  • Fjerner whitespace fra starten av KID-feltet.

  • Alle datoer blir transformert fra formen DDMMYY (bare de to siste tallene i årstallet brukes) til en streng på formen YYYY-MM-DD (ISO8601). Det antas her at årstallet begynner med 20.

  • Ledende nuller fra felter som ikke er en KONTO, en KODE eller en TYPE fjernes.

  • Alle beløper er i øre i fila, og deles på hundre for å gjøres om til kroner.

  • Tomme felter fjernes (dette inkluderer felter som kun hadde nuller).

  • DEBET_KONTO og POSTGIROKONTO fjernes hvis den kun inneholdt nuller.

kid_hash(@arr)

kid_hash() tar en array som har blitt redusert med reduce() og returnerer en hash der KID-nummerne brukes som nøkler for transaksjonene som fila inneholder. Transaksjonene selv representeres ved hashrefs, der nøkkelordene fra spesifikasjonen brukes (se over).

Data fra fila som ikke er tilknyttet enkelte transaksjoner (f.eks. sum beløp) kastes vekk av denne rutinen. Feltet RECORDTYPE fjernes også fordi data fra RECORDTYPEne 30 og 31 begge inkluderes.

Hvordan dette gjøres i detalj er en smule innviklet, og det er potensiale for en bug i dette. Se under "BUGS" hvis detaljene er interessante.

BUGS/TODO

Y2K

reduce() antar at årstallet begynner med 20. Dette vil selvfølgelig ikke fungere hvis man jobber på data fra 1900-tallet (eller 2100-tallet...). Dette er ikke min feil, fordi BBS sine filer representerer årstall med kun to siffer. De har således en Y2K-feil.

Ett oppdrag

Jeg har kun operert på filer der det har vært et enkelt oppdrag per fil. Flere oppdrag per fil er utestet og kid_hash() vil sannsynligvis ikke fungere på slike filer, så se på det som en TODO. Det bør ikke influere de andre rutinene. Jeg antar at hvis man kun har en OCRGiro-avtale vil man kunne bruke kid_hash() som den er.

Sammenstilling av transaksjoner

Å sette sammen transaksjoner fra forskjellige RECORDTYPEr slik det gjøres av kid_hash() er som nevnt litt innviklet. Det gjøres ved å sammenligne feltene TRANSAKSJONSNUMMER fra forskjellige records. I seg selv greit, og siden alle filer jeg har sett har hatt records med samme transaksjonsnummer umiddelbart etter hverandre, er det antatt at dette gjelder generelt. Spesifikasjonen er ikke klar på dette punktet. kid_hash() inneholder en enkel sjekk på om dette er tilfelle for hver enkel record, og vil dø med en feilmelding hvis antagelsen ikke holder.

Operere på filehandles

Det hadde vært mer elegant om parse() faktisk kunne operere på filehandles, av mer generisk art.

AUTHOR

Kjetil Kjernsmo <kk@kjernsmo.net>

COPYRIGHT AND LICENSE

Copyright 2003, Kjetil Kjernsmo. Some rights reserved.

This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 39:

Non-ASCII character seen before =encoding in 'å'. Assuming CP1252