/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
NEWBIE: adresseudtræk - 22.000 tekstlin
Fra : Villum Sejersen


Dato : 10-04-03 18:35

Hej Guruer!

Når man har et adresseudtræk, en tekstfil med ca. 22.000 linjer af
nogenlunde dette udseende (Det er et S229 fra Kommunedata):

,327,0006053,1,Villum Sejersen,,Nørregade 1 A,,4500 Nykøbing Sj,

Altså kommaafgrænset, 8 felter (hvoraf nr. 3 uinteressant), hvad er så
den mest fornuftige måde at dissekere sådan en sag på uden at vælte
pc-en? 22.000 linjer * typisk 80 tegn giver immervæk 2-3MB at holde styr
på, plus det løse. Arrays og hashes er klart svaret, men hvilke
kombinationer er bedst med denne størrelsesorden datamængde når:

Ønskesedlen går på, bagefter i det mindste at kunne sortere på felterne
8-4 (så resultatet kommer efter postdistrikt), samt at kunne sortere
dubletter fra, dvs. hvor felterne 4-8 er indholdsmæssigt helt ens. Der
skal også helst kunne checkes for manglende feltindhold samt for
bestemte indhold ((del)strenge) i disse fem felter.

Perlversionen er 5.8.0 (w2k, ActiveState).

Jeg har som 'godnatlæsning' liggende "dromedarbogen" (Programming
Perl, 3. ed.) samt David Cross': "Datamunging with Perl", og
eksperimenterer - selvfølgelig med alle warnings slået til! - ud fra
nogle af eksemplerne deri, men har svært ved at træffe fornuftige
startvalg ud fra min selvfølgelig meget mindre testfil.

Jeg vil blive meget glad for lidt inspirerende igangsætning. Helst
forklarede kodeeksempler og/eller henvisninger til hvorfor hvilke valg
er de rigtige i den givne sammenhæng.

--
Villum Sejersen


 
 
Flemming Frandsen (10-04-2003)
Kommentar
Fra : Flemming Frandsen


Dato : 10-04-03 20:42

Villum Sejersen wrote:
> den mest fornuftige måde at dissekere sådan en sag på uden at vælte
> pc-en? 22.000 linjer * typisk 80 tegn giver immervæk 2-3MB at holde styr
> på, plus det løse.

Bah, RAM er billigt, jeg har flere gange kværnet mange GB tekst gennem
perl uden problemer, jeg vil foreslå:

open INPUT, "<filen.csv" or die "screaming: $!";
my @input = map { chomp; [split /,/] } <INPUT>;
close INPUT;

Så har du et array af array-refs som du kan rode med, det kan godt være
pænere at bruge et array af hashrefs i stedet, men det kan man selv om.


> samt at kunne sortere
> dubletter fra, dvs. hvor felterne 4-8 er indholdsmæssigt helt ens.

For at sortere dupletter fra bruger du blot et hash:

my %seen;
my @unique = grep { !$seen{join ',', $_->[4,8]}++ } @input;

Så har du kun forekomster i @unique som er unikke i felt 4-8 (husk at
det første element i et array er nummer 0)


> Ønskesedlen går på, bagefter i det mindste at kunne sortere på felterne
> 8-4 (så resultatet kommer efter postdistrikt),

my @sorted = sort {
$a->[8] cmp $b->[8] ||
$a->[7] cmp $b->[7] ||
$a->[6] cmp $b->[6] ||
$a->[5] cmp $b->[5] ||
$a->[4] cmp $b->[4]
} @unique;


> Der skal også helst kunne checkes for manglende feltindhold samt for
> bestemte indhold ((del)strenge) i disse fem felter.

Prøv med eq, f.eks:
if($l->[0] eq '') {
die "ÅH, Gud, nej! stengen er tom!!!";
}


> men har svært ved at træffe fornuftige startvalg ud fra min
> selvfølgelig meget mindre testfil.

Prøv at skrive det simpelst mulige program der gør det du vil, i perl
betyder det typisk også det hurtigste og det der er lettest at
vedligeholde og se om ikke det kører hurtigt nok på den rigtige mængde data.


> Jeg vil blive meget glad for lidt inspirerende igangsætning. Helst
> forklarede kodeeksempler og/eller henvisninger til hvorfor hvilke valg
> er de rigtige i den givne sammenhæng.

Det håber jeg du har fået, jeg har nok brugt et par skumle perl tricks,
men her vil dine (iøvrigt gode) bøger hjælpe:)

--
Regards Flemming Frandsen - http://dion.swamp.dk
PartyTicket.Net co founder & Yet Another Perl Hacker


Villum Sejersen (11-04-2003)
Kommentar
Fra : Villum Sejersen


Dato : 11-04-03 10:30

Flemming Frandsen wrote:

> [snip: masser af gode ideer]

> Prøv at skrive det simpelst mulige program der gør det du vil, ...

Det prøver jeg i forvejen; om ikke af andre grunde så for at holde
antallet af tungt forståelige warnings nede!

>> ... lidt inspirerende igangsætning. ...

> Det håber jeg du har fået, jeg har nok brugt et par skumle perl tricks,
> men her vil dine (iøvrigt gode) bøger hjælpe:)

Tak for både igangsætning og tricks!

Jeg har godt nok haft perl installeret de sidste fem års tid (på tre
forskellige platforme), men ikke tidligere haft anledning til at at
prøve kræfter med et konkret projekt.

--
Villum Sejersen


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste