Gegeven is een CSV-bestand, met als gedaante:
Naam1;Naam2;GeboorteDatum1;GeboorteDatum2;InschrijfDatum; A; B; ...
(zie ook het voorbeeld onderaan de opgave)
Hierbij bevatten alle kolommen van het bestand strings. In het geval van de kolommen 'Naam1' en 'Naam2' stellen
deze de namen van personen voor, de kolommen 'GeboorteDatum1', 'GeboorteDatum2' en 'InschrijfDatum' stellen data voor
en de kolommen met hoofding 'A', 'B', ... stellen gehele getallen voor. De volgorde van de kolommen kan
afwijken van de hierboven weergegeven volgorde.
In deze oefening maken we een klasse Werkblad
, waarbij de inhoud van het werkblad
in dit CSV-bestand te vinden is. Bedoeling is de inhoud van dit werkblad te anonimiseren,
zodat de gegevens op anonieme basis kunnen verwerkt worden. Hierbij worden gegevens vager gemaakt,
zodat het moeilijker wordt om de gegevens aan een fysieke persoon te koppelen. We zullen hiertoe een
aantal klassen bouwen die elk gespecialiseerd zijn in het anonimiseren van een specifiek soort gegevens (strings,
datums en gehele getallen). We starten de oefening met het programmeren van de klasse Werkblad
waarna
de klasse Anonimisator
gebouwd wordt. Vervolgens worden klassen gerealiseerd die overerven van de klasse
Anonimisator
. Elke anonimisator is bedoeld om 1 kolom (met uitzondering van de hoofding) te vervagen.
Werkblad
:
een constructor met 1 argument, namelijk de naam van het CSV-bestand waar de gegevens van het werkblad te vinden zijn
de methode __str__()
levert de string-gedaante van de lijst-van-lijsten gedaante van het werkblad (maak
hier uiteraard gebruik van de ingebouwde stringconversie van lijsten !)
de methode voeg_anonimisator_toe()
met 1 argument, een object van de klasse Anonimisator
(of van een overervende klasse van Anonimisator
). Deze methode voegt de anonimisator toe aan het werkblad.
Elke anonimisator werkt in op een kolom van het werkblad.
de methode aantal_anonimisators()
: deze methode levert een lijst gehele getallen als resultaat. Deze lijst
telt evenveel elementen als er kolommen zijn in het werkblad. Het element op positie $$i$$ geeft hierbij aan hoeveel
anonimisatoren toegevoegd werden m.b.t. kolom met rangnummer $$i$$ (kolommen worden genummerd vanaf 0). Vermits we in deze
oefening hoogstens 1 anonimisator per kolom zullen toevoegen, zijn alle elementen van deze lijst 0 of 1. Je mag veronderstellen
dat in de klasse Anonimisator
een methode get_kolom()
(zonder argumenten) beschikbaar is, die de hoofding van de kolom teruggeeft waarop de anonimisator ingrijpt.
de methode anonimiseer()
zonder argumenten past alle toegevoegde anonimisatoren toe op het werkblad. Je mag ervan uitgaan
dat elke anonimisator over een methode anonimiseer()
beschikt, met 1 argument, namelijk een werkblad (dus een object
van de klasse Werkblad
).
de methode schrijf()
met als enig argument een string, schrijft de gegevens van het werkblad terug weg naar een CSV-bestand waarvan
de naam te vinden is in het argument van die methode.
een constructor met 1 string-argument, namelijk het de hoofding van de kolom die moet geanonimiseerd worden. Je mag aannemen dat het om een bestaande hoofding gaat.
de methode get_kolom()
zonder argumenten, levert de hoofding van de kolom waarop de anonimisator van
toepassing is
de methode anonimiseer()
met 1 argument, namelijk een object van de klasse Werkblad
.
De methode anonimiseert de gewenste kolom van dit argument. De methode uit deze klasse vervangt elk element (behalve
de hoofding) door de string '-' (een minteken).
Anonimisator
de methode anonimiseer()
zodanig dat
uit elke celinhoud (behalve de hoofding) alle tekens behalve hoofdletters geschrapt worden. Na de anonimisatie bevat de
cel dus enkel hoofdletters, in de volgorde waarin ze in de oorspronkelijke celinhoud voorkwamen.
Anonimisator
is van toepassing op kollomen die enkel datums bevatten (op de hoofding na). Hierbij
wordt het 'formaat dag/maand/jaar' (in stringformaat) gebruikt. De anonimisatie houdt hier in dat enkel maand
en jaar in het formaat 'maand/jaar' in het resultaat behouden worden. Programmeer de methode anonimiseer()
die dit gedrag realiseert.
Anonimisator
.
Deze validator wordt enkel toegepast op kolommen die eigenlijk ints bevatten (op de hoofding na).
Deze ints zijn in het werkblad opgeslagen als strings.
Programmeer in deze klasse:
een constructor met twee argumenten, namelijk:
de methode anonimiseer()
met 1 argument, een object van de klasse Werkblad
.
Ook hier krijgt een cel (behalve de hoofding) een nieuwe inhoud. Elke aan te passen cel wordt hierbij als geheel getal
geïnterpreteerd. In dit resultaat worden de $$m \gt 0$$ minst beduidende cijfers door 0 vervangen. Indien er minder
dan $$m$$ beduidende cijfers in het getal aanwezig zijn, is het resultaat 0. Let erop dat de celinhoud opnieuw een string
wordt. Voor $$m = 2$$ wordt op die manier de cel '1233' vervangen door '1200', '504' door '500', '199' door '100' en '59' door '0'.
Inhoud van 'Anonimisatie_0_in.csv' Naam1;C;InschrijfDatum;GeboorteDatum1;B;A;D;Naam2;GeboorteDatum2 Van de Putte, Xantippe;627;14/11/2012;20/2/1995;204;296;613;Vrielinck, Patrick;20/6/1998 Geeraert, Femke;139;3/5/2010;8/8/1998;451;598;817;Geeraert, Werner;17/12/1985 De Jonge, Jamie;446;26/6/2016;17/12/1994;600;772;426;Paulussen, Ulrike;6/1/1981 Jansens, Inke;925;15/11/2013;21/5/1989;387;870;530;Cornelissen, Jamie;24/2/1998 Paulussen, Ulrike;658;25/2/2014;24/8/1989;350;110;851;Nachtegaele, Ode;1/12/1986 Bomans, Lotte;698;4/9/2015;27/9/1999;719;244;413;Bomans, Renee;2/11/1986 Verstraete, Vanya;926;3/7/2013;21/2/2000;922;269;223;Verstraete, Vanya;23/9/1996 Vergote, Karien;719;15/9/2013;2/4/1993;549;594;202;Vergote, Xantippe;1/2/1991 Vrielinck, Zoe;482;13/1/2010;19/8/1987;188;520;583;De Jonge, Karien;17/10/1985 Pieters, Miriam;953;21/8/2015;2/7/1992;533;850;647;Truwant, Quinten;7/12/1996 blad = Werkblad('Anonimisatie_0_in.csv')# doctest: +NEWCONTEXT print(blad) #[['Naam1', 'C', 'InschrijfDatum', 'GeboorteDatum1', 'B', 'A', 'D', 'Naam2', 'GeboorteDatum2'], ['Van de Putte, Xantippe', '627', '14/11/2012', '20/2/1995', '204', '296', '613', 'Vrielinck, Patrick', '20/6/1998'], ['Geeraert, Femke', '139', '3/5/2010', '8/8/1998', '451', '598', '817', 'Geeraert, Werner', '17/12/1985'], ['De Jonge, Jamie', '446', '26/6/2016', '17/12/1994', '600', '772', '426', 'Paulussen, Ulrike', '6/1/1981'], ['Jansens, Inke', '925', '15/11/2013', '21/5/1989', '387', '870', '530', 'Cornelissen, Jamie', '24/2/1998'], ['Paulussen, Ulrike', '658', '25/2/2014', '24/8/1989', '350', '110', '851', 'Nachtegaele, Ode', '1/12/1986'], ['Bomans, Lotte', '698', '4/9/2015', '27/9/1999', '719', '244', '413', 'Bomans, Renee', '2/11/1986'], ['Verstraete, Vanya', '926', '3/7/2013', '21/2/2000', '922', '269', '223', 'Verstraete, Vanya', '23/9/1996'], ['Vergote, Karien', '719', '15/9/2013', '2/4/1993', '549', '594', '202', 'Vergote, Xantippe', '1/2/1991'], ['Vrielinck, Zoe', '482', '13/1/2010', '19/8/1987', '188', '520', '583', 'De Jonge, Karien', '17/10/1985'], ['Pieters, Miriam', '953', '21/8/2015', '2/7/1992', '533', '850', '647', 'Truwant, Quinten', '7/12/1996']] basis = Anonimisator('C') naam = StringAnonimisator('Naam1') datum = DatumAnonimisator('InschrijfDatum') geg1 = IntAnonimisator('B', 1) geg2 = IntAnonimisator('D', 2) blad.voeg_anonimisator_toe(basis) blad.voeg_anonimisator_toe(naam) blad.voeg_anonimisator_toe(datum) blad.voeg_anonimisator_toe(geg1) blad.voeg_anonimisator_toe(geg2) print(blad.aantal_anonimisators()) #[1, 1, 1, 0, 1, 0, 1, 0, 0] blad.anonimiseer() print(blad) #[['Naam1', 'C', 'InschrijfDatum', 'GeboorteDatum1', 'B', 'A', 'D', 'Naam2', 'GeboorteDatum2'], ['VPX', '-', '11/2012', '20/2/1995', '200', '296', '600', 'Vrielinck, Patrick', '20/6/1998'], ['GF', '-', '5/2010', '8/8/1998', '450', '598', '800', 'Geeraert, Werner', '17/12/1985'], ['DJJ', '-', '6/2016', '17/12/1994', '600', '772', '400', 'Paulussen, Ulrike', '6/1/1981'], ['JI', '-', '11/2013', '21/5/1989', '380', '870', '500', 'Cornelissen, Jamie', '24/2/1998'], ['PU', '-', '2/2014', '24/8/1989', '350', '110', '800', 'Nachtegaele, Ode', '1/12/1986'], ['BL', '-', '9/2015', '27/9/1999', '710', '244', '400', 'Bomans, Renee', '2/11/1986'], ['VV', '-', '7/2013', '21/2/2000', '920', '269', '200', 'Verstraete, Vanya', '23/9/1996'], ['VK', '-', '9/2013', '2/4/1993', '540', '594', '200', 'Vergote, Xantippe', '1/2/1991'], ['VZ', '-', '1/2010', '19/8/1987', '180', '520', '500', 'De Jonge, Karien', '17/10/1985'], ['PM', '-', '8/2015', '2/7/1992', '530', '850', '600', 'Truwant, Quinten', '7/12/1996']] blad.schrijf('Anonimisatie_0_2_out.csv') Inhoud van 'Anonimisatie_0_2_out.csv' Naam1;C;InschrijfDatum;GeboorteDatum1;B;A;D;Naam2;GeboorteDatum2 VPX;-;11/2012;20/2/1995;200;296;600;Vrielinck, Patrick;20/6/1998 GF;-;5/2010;8/8/1998;450;598;800;Geeraert, Werner;17/12/1985 DJJ;-;6/2016;17/12/1994;600;772;400;Paulussen, Ulrike;6/1/1981 JI;-;11/2013;21/5/1989;380;870;500;Cornelissen, Jamie;24/2/1998 PU;-;2/2014;24/8/1989;350;110;800;Nachtegaele, Ode;1/12/1986 BL;-;9/2015;27/9/1999;710;244;400;Bomans, Renee;2/11/1986 VV;-;7/2013;21/2/2000;920;269;200;Verstraete, Vanya;23/9/1996 VK;-;9/2013;2/4/1993;540;594;200;Vergote, Xantippe;1/2/1991 VZ;-;1/2010;19/8/1987;180;520;500;De Jonge, Karien;17/10/1985 PM;-;8/2015;2/7/1992;530;850;600;Truwant, Quinten;7/12/1996