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