Oefening 7: De zalm van objectoriëntatie

Doel

Lezen en schrijven van tekstbestanden.

Opdracht

  1. Lees een tekstbestand.
  2. Lees een CSV bestand: leeftijd per statistische sector en bereken de gemiddelde leeftijd.
  3. Benader het getal e door willekeurige getallen te genereren en het gemiddelde van het aantal getallen te berekenen. Schrijf alle willekeurige getallen weg in een CSV bestand.

Lezen van een bestand

  1. Download het bestand mysterie van Toledo.
  2. Lees en print de inhoud van het bestand.

    import java.io.*;
    import java.util.*;
    
    //...
    
    String locatie = //...
    try {
         Scanner lezer = new Scanner(new File(locatie));
    
         while(lezer.hasNextLine()) {
           lezer.nextLine();
           //...
         }
         lezer.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
    
    1. De variabele locatie wijst naar de locatie op het bestandsysteem.
      1. Deze locatie kan je absoluut aanduiden. bvb. "C:\\Users\\Documents\\mysterie" bemerk hierbij dat de eerste backslash de tweede backslash escaped, waardoor het daaropvolgend karakter niet aanzien wordt als een format specifier in de String literal.
      2. Een locatie kan ook relatief aangeduid worden. bvb.".\\mysterie" wijst naar het bestand mysterie in de huidige folder. "..\\mysterie" wijst naar het bestand mysterie in de folder boven de huidige folder.
    2. Het try{ }catch(Exception e){} blok is een constructie die wordt gebruikt als de methoden in de try blok een checked exception kunnen werpen. Indien in dit codevoorbeeld het bestand van de locatie variabele niet bestaat, zal dit een IOException werpen. De catch blok geeft aan wat er in dat geval moet gebeuren. In dit geval wordt gekozen om de informatie in de console weer te geven en het programma te stoppen. In principe kan je ook aan de gebruiker een nieuwe locatie vragen, zodat het programma niet moet stoppen.
    3. Indien het bestand wel op de aangegeven locatie terug te vinden is, wordt een Scanner object aangemaakt. Het File object is een stream net zoals System.in. Met de methode hasNextLine van het Scanner object kan men controleren of het einde van het bestand nog niet werd bereikt. Met de methode nextLine, leest men de volgende regel uit. Door dit in een while lus te doen, kan men het bestand regel per regel uitlezen.
    4. De scanner wordt tenslotte gesloten.

Vraag 1

    Wat staat er op regel 42?

Comma Separated Value (CSV) bestand

  1. Download het CSV bestand leeftijd per statistische sector.
  2. Lees de data uit per statistische sector.

    1. Een CSV stelt een tabel voor waarbij kolommen worden gescheiden door een separator in dit geval ; en de rijen met een newline.
    2. In principe is het mogelijk om zelf alle data uit te lezen en in de gewenste vorm te gieten. Tip: de split methode van de String klasse.
    3. Of: voor gestandaardiseerde bestandsformaten zijn er (veel) bibliotheken terug te vinden. Een voorbeeld hiervan is org.apache.commons.csv.

      1. Download de laatste release en voeg die toe.
        1. Pak het bestand uit.
        2. Importeer het commons-csv-1.x.jar bestand in BlueJ. Via Tools -> Preferences -> Libraries -> Add File
        3. Reset de Java Virtual Machine via Tools -> Reset ...
      2. Maak een nieuwe CSV parser.

        1. Importeer de klassen voor CSV en voor de Charset.
          import org.apache.commons.csv.*;
          import java.nio.charset.Charset;
          
        2. Gebruik de statische methode parse van de klasse CSVParser.
        3. Eerste argument is de CSV File.
        4. Tweede argument is een character set, zoals UTF-16, gebruik de default charset: Charset.defaultCharset()
        5. Definieer separator en geef aan dat er een header is voorzien:

        CSVParser parser = CSVParser.parse(new File(locatie), Charset.defaultCharset(), CSVFormat.newFormat(';').withHeader());

        1. parser.getRecords() levert een lijst van CSVRecords. Een CSVRecord is een rij uit de CSV.
        2. Roep de close methode aan.
      3. Lees de data uit de CSVRecords
        1. Met de overladen get methode is het mogelijk om een kolom uit een CSVRecord op te halen. Doordat een header voorzien is, kan de naam van de header gebruikt worden om de waarde op te halen. Bvb.
          CSVRecord record;
          record.get("Sectornaam");
          
  3. Bereken de gemiddelde leeftijd per statistische sector.

Vraag 2

    Wat is de gemiddelde leeftijd in de sector SINT-MICHIELS-CENTRUM?

Schrijven van een bestand

  1. Het is mogelijk het getal e te benaderen door willekeurige getallen te genereren.
    1. Zolang het totaal kleiner is dan 1, genereer een nieuw willekeurig getal tussen [0,1[ en tel het op bij het totaal.
    2. Herhaal > 1 000 000
    3. Het gemiddeld aantal gegenereerde getallen benadert e.
  2. Gebruik bovenstaand algoritme om e te benaderen. Schrijf alle gegenereerde getallen weg naar een CSV bestand. Eenmaal het totaal groter is dan 1, begin een volgende rij.

Extra

  1. Zoek in het bestand leeftijd per statistische sector de sector met de laagste gemiddelde leeftijd.

results matching ""

    No results matching ""