Gegeven is een CSV-bestand, met als gedaante:
Verkoper; Data1; Data2; ...
(zie ook het voorbeeld onderaan de opgave)
Hierbij zijn de hoofdingen 'Data1, 'Data2', enz. placeholders (m.a.w. in de echte
bestanden staan andere hoofdingen). De hoofding 'Verkoper' komt
als eerste hoofding in het bestand voor.
In deze oefening maken we een klasse Werkblad
, waarbij de inhoud van het werkblad
in dit CSV-bestand te vinden is. Bedoeling is om een rij toe te voegen aan het bestand, waarbij
de waarde van elke cel in die rij (behalve de eerste cel) een functie is van waarden in dezelfde kolom.
Programmeer in de klasse 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 get_kolom_hoofding()
waarbij je een lijst van strings als resultaat terugkrijgt,
die de hoofding van elke kolom voorstelt (het eerste element van die lijst is hier dus steeds 'Verkoper'
)
de methode get_kolom()
met 1 geheel argument. Dit argument stelt een kolomnummer voor van het werkblad.
De methode levert een lijst van de gegevens in de gewenste kolom, ZONDER de hoofding (m.a.w. het eerste element van dit resultaat
vind je op de 2de rij van het CSV-bestand). Je mag aannemen dat het om een geldig kolomnummer gaat.
de methode get_rijnummer()
met 1 argument van het type string. Het resultaat is het rijnummer waar dit argument voorkomt in kolom met rangnummer 0 in het werkblad. Komt dit argument NIET voor
in deze kolom, dan levert de methode -1 als resultaat. Hierbij wordt bij de nummering van de rijen de hoofding NIET meegerekend! De eerste rij met gegevens
krijgt dus rangnummer 0.
de operator +=
heeft als rechteroperand een tuple, met inhoud:
de functie 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.
De bestanden die Dodona gebruikt in de testcases vind je in het gecomprimeerde bestand ToevoegenVanRijen.zip1.
Inhoud 'Verkoop_0.csv' Verkoper;Denemarken;Duitsland;Frankrijk;Belgie Verstraete, Werner;696,0;786,0;226,0;628,0 Cornelissen, Sofie;950,0;1699,0;1569,0;1681,0 Jansens, Quinten;748,0;635,0;1855,0;653,0 Vrielinck, Patrick;495,0;271,0;1504,0;1407,0 Vergote, Erwin;1020,0;313,0;465,0;1846,0 Nachtegaele, Zoe;1045,0;1785,0;1573,0;523,0 Truwant, Thomas;797,0;1315,0;694,0;772,0 blad = Werkblad('Verkoop_0_in.csv') print(blad) #[['Verkoper', 'Denemarken', 'Duitsland', 'Frankrijk', 'Belgie'], ['Verstraete, Werner', '696,0', '786,0', '226,0', '628,0'], ['Cornelissen, Sofie', '950,0', '1699,0', '1569,0', '1681,0'], ['Jansens, Quinten', '748,0', '635,0', '1855,0', '653,0'], ['Vrielinck, Patrick', '495,0', '271,0', '1504,0', '1407,0'], ['Vergote, Erwin', '1020,0', '313,0', '465,0', '1846,0'], ['Nachtegaele, Zoe', '1045,0', '1785,0', '1573,0', '523,0'], ['Truwant, Thomas', '797,0', '1315,0', '694,0', '772,0']]" print(blad.get_kolom_hoofding()) #['Verkoper', 'Denemarken', 'Duitsland', 'Frankrijk', 'Belgie'] print(blad.get_kolom(2)) #['786,0', '1699,0', '635,0', '271,0', '313,0', '1785,0', '1315,0'] print(blad.get_rijnummer('Cornelissen, Sofie')) #1 f1 = lambda s:sum(s)/len(s) blad += ('Gemiddelde[5:6]', 5, 6, f1) str(blad) #[['Verkoper', 'Denemarken', 'Duitsland', 'Frankrijk', 'Belgie'], ['Verstraete, Werner', '696,0', '786,0', '226,0', '628,0'], ['Cornelissen, Sofie', '950,0', '1699,0', '1569,0', '1681,0'], ['Jansens, Quinten', '748,0', '635,0', '1855,0', '653,0'], ['Vrielinck, Patrick', '495,0', '271,0', '1504,0', '1407,0'], ['Vergote, Erwin', '1020,0', '313,0', '465,0', '1846,0'], ['Nachtegaele, Zoe', '1045,0', '1785,0', '1573,0', '523,0'], ['Truwant, Thomas', '797,0', '1315,0', '694,0', '772,0'], ['Gemiddelde[5:6]', '1045,0', '1785,0', '1573,0', '523,0']]" f2 = lambda s:min(s) blad += ('Minimum[3:6]', 3, 6, f2) str(blad) #[['Verkoper', 'Denemarken', 'Duitsland', 'Frankrijk', 'Belgie'], ['Verstraete, Werner', '696,0', '786,0', '226,0', '628,0'], ['Cornelissen, Sofie', '950,0', '1699,0', '1569,0', '1681,0'], ['Jansens, Quinten', '748,0', '635,0', '1855,0', '653,0'], ['Vrielinck, Patrick', '495,0', '271,0', '1504,0', '1407,0'], ['Vergote, Erwin', '1020,0', '313,0', '465,0', '1846,0'], ['Nachtegaele, Zoe', '1045,0', '1785,0', '1573,0', '523,0'], ['Truwant, Thomas', '797,0', '1315,0', '694,0', '772,0'], ['Gemiddelde[5:6]', '1045,0', '1785,0', '1573,0', '523,0'], ['Minimum[3:6]', '495,0', '271,0', '465,0', '523,0']]" blad.schrijf('Verkoop_0_out.csv') Inhoud 'Verkoop_0_out.csv' Verkoper;Denemarken;Duitsland;Frankrijk;Belgie Verstraete, Werner;696,0;786,0;226,0;628,0 Cornelissen, Sofie;950,0;1699,0;1569,0;1681,0 Jansens, Quinten;748,0;635,0;1855,0;653,0 Vrielinck, Patrick;495,0;271,0;1504,0;1407,0 Vergote, Erwin;1020,0;313,0;465,0;1846,0 Nachtegaele, Zoe;1045,0;1785,0;1573,0;523,0 Truwant, Thomas;797,0;1315,0;694,0;772,0 Gemiddelde[5:6];1045,0;1785,0;1573,0;523,0 Minimum[3:6];495,0;271,0;465,0;523,0