Tekstbestanden inlezen
Home

Tekstbestanden inlezen

Tekstbestanden inlezen

Implementeert een TextReader die karakters leest uit een bytestroom in een bepaalde codering.

Probleem

Net als bij het schrijven van een bestand bestaat ook het lezen uit een bestand uit 4 stappen:

  1. Importeer de namespace System.IO.
  2. Open van het bestand en creatie van StreamReader-object voor het bestand.
  3. Lees uit het bestand.
  4. Sluiten van het bestand

Plaats de code voor het inlezen van een tekstbestand in een try catch finally blok.Het kan altijd gebeuren dat het bestand, dat je probeert in te lezen, niet bestaat. In de finally block sluit je de stream want die moet in beide gevallen gesloten worden.

public bool LeesMetFinally()
{
    // we gaan ervan uit dat er iets misloopt
    bool result = false;
    StreamReader sr = null;
    try
    {
        // Creëer een instantie van de StreamReader klasse om 
        // een bestand in te lezen. 
        // De StreamReader wordt gesloten in het finally blok. 
        sr = new StreamReader(this.fileName);
        // Lees tot het einde van het bestand
        this.text = sr.ReadToEnd();
        result = true;
    }
    catch (Exception e)
    {
        // Schrijf hier de code die moet worden uitgevoerd
        // als er iets mis loopt
    }
    finally
    {
        sr.Close();
    }
    return result;
}

Je moet de StreamReader buiten het try catch finally block declareren omdat de StreamReader zowel in de try blok en als in de finally blok toegankelijk moet zijn. Daarenboven moet je instantie van StreamReader initialiseren met null.

Dat moet je niet doen als je een using blok gebruikt om de stream te openen. In dat geval wordt de stream gesloten bij het afsluiten van de codeblok. Dit is de meest gebruikelijke manier in .NET.

public bool Lees()
{
    // we gaan ervan uit dat er iets misloopt
    bool result = false;
    try
    {
        // Creëer een instantie van de StreamReader klasse om 
        // een bestand in te lezen. 
        // Het using statement sluit ook de StreamReader. 
        using (StreamReader sr = new StreamReader(this.fileName))
        {
            // Lees tot het einde van het bestand
            this.text = sr.ReadToEnd();
            this.melding = String.Format(
                "Het bestand met de naam {0} is ingelezen.Het bevat {1} karakters en {2} woorden en {3} regels.",
                this.fileName, this.text.Length, this.text.Split(' ').Length, this.text.Split('\n').Length);
            result = true;
        }
    }
    catch (Exception e)
    {
        // Melding aan de gebruiker dat iets verkeerd gelopen is.
        // We gebruiken hier de nieuwe mogelijkheid van C# 6: string interpolatie
        this.melding = $"Kan het bestand met de naam {this.fileName} niet inlezen.\nFoutmelding {e.Message}.";
    }
    return result;
}

Vermits deze klasse data ophaalt vanaf de harde schrijf uit een bestand dat extern is aan C#, plaatsen we die klasse in de Dal namespace. We plaatsen de code in een bestand met de naam Tekstbestand.cs en plaatsen het bestand in de App_Code/Dal submap in de root van ons project. Indien je die submap nog niet gemaakt hebt, maak je die eerst. Zie onderstaande figuur.

Een klassenbestand in de Dal map van App_Code
Een klassenbestand in de Dal map van App_Code

Design

Velden

naam bereik type omschrijving
text private string buffer voor de ingelezen text
melding private string foutmelding of melding dat het gelukt is
fileName private string de naam van het bestand dat ingelezen moet worden

Eigenschappen

naam bereik type omschrijving
Text public string getter en setter voor text
Melding public string getter en setter melding
FileName public string getter en setter vor fileName

Methoden

naam bereik type omschrijving
Lees public boolean open het bestand met de naam die staat in fileName en indien succesvol plaatst de tekst in de text buffer. Retourneert true indien succesvol anders false.
Schrijf public boolean Schrijft wat in de text buffer staat naar de harde schijf en geeft er de naam aan die staat in fileName.(nog te maken)

Oplossing: App_Code/Dal/TekstBestand.cs

using System;
using System.IO;

namespace Dal
{
    class Tekstbestand
    {
        private string text;

        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        private string melding;

        public string Melding
        {
            get { return melding; }
        }

        private string fileName;

        public string FileName
        {
            get { return fileName; }
            set
            {
                this.fileName = value;
            }
        }

        public bool Lees()
        {
            // we gaan ervan uit dat er iets misloopt
            bool result = false;
            try
            {
                // Creëer een instantie van de StreamReader klasse om 
                // een bestand in te lezen. 
                // Het using statement sluit ook de StreamReader. 
                using (StreamReader sr = new StreamReader(this.fileName))
                {
                    // Lees tot het einde van het bestand
                    this.text = sr.ReadToEnd();
                    this.melding = String.Format(
                        "Het bestand met de naam {0} is ingelezen.Het bevat {1} karakters en {2} woorden en {3} regels.",
                        this.fileName, this.text.Length, this.text.Split(' ').Length, this.text.Split('\n').Length);
                    result = true;
                }
            }
            catch (Exception e)
            {
                // Melding aan de gebruiker dat iets verkeerd gelopen is.
                // We gebruiken hier de nieuwe mogelijkheid van C# 6: string interpolatie
                this.melding = $"Kan het bestand met de naam {this.fileName} niet inlezen.\nFoutmelding {e.Message}.";
            }
            return result;
        }
    }
}

Gebruik

Vermits je een nieuwe bibliotheek hebt toegevoegd kan het zijn dat je het project moet rebuilden. Vooraleer te rebuilden moet je eerst nog aangeven dat het Tekstbestand.cs geen content is maar code:

  1. open het Tekstbestand.cs in de Visual Studio Editor
  2. open het Property venster
  3. wijzig de Build Action eigenschap in Compile
De Build Action eigenschap voor een bestand in VS wijzigen
De Build Action eigenschap voor een bestand in VS wijzigen

Je kan die klasse gebruiken om bijvoorbeeld een csv bestand in te lezen. Je schrijft een methode die de inhoud van het bestand retourneert:

public string ReadFromCSVFile()
{
    Dal.Tekstbestand bestand = new Dal.Tekstbestand();
    bestand.FileName = @"C:\Programmeren 3\12716\LerenWerkenMetMVC\App_Data\Postcodes.csv";
    bestand.Lees();
    return bestand.Text;
}

JI
2016-10-27 14:19:42