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.

De klasse Werkblad

Programmeer in de klasse Werkblad:

De klasse Anonimisator

Dit is de basisklasse voor elke anonimisator. Programmeer in deze klasse:

De klasse StringAnonimisator

Programmeer in deze klasse, die overerft van 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.

De klasse DatumAnonimisator

Deze anonimisator, die overerft van de klasse 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.

De klasse IntAnonimisator

Ook deze klasse erft over van de klasse 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:

Voorbeeld

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