WPO 13

Als laatste zullen we het gebruik van bestanden bespreken. In onderstaande codefragmenten wordt aangehaald hoe de verschillende operaties (read,write en append) tewerk gaan. De append-methode is een variant op het gewone schrijven, met als voornaamste verschil dat de append automatisch data achteraan het bestand toevoegt, terwijl het gewoon schrijven naar een bestand eerst het bestand volledig wist, en dan pas data in het bestand schrijft. De append-methode komt overeen met een += operatie bij een string.

private void btnRead_Click(object sender, EventArgs e) { // Open the file to read from. try { // generate string for the current file name // note the '@' at the beginning string path = @"E:\test.txt"; using (StreamReader sr = File.OpenText(path)) { string s = ""; // read line by line until the end of file (s==null) // has been reached while ((s = sr.ReadLine()) != null) { // write the current line in a textbox. txtOutput.Text += s + "\r\n"; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // write data to a file private void btnWrite_Click(object sender, EventArgs e) { try { string path = @"E:\test.txt"; using (StreamWriter sw = File.CreateText(path)) { sw.Write(txtOutput.Text); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // append data to a file private void btnAppend_Click(object sender, EventArgs e) { try { string path = @"E:\test.txt"; using (StreamWriter sw = File.AppendText(path)) { sw.Write(txtOutput.Text); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Merk op dat de strings die gebruikt worden als paden voor het filesysteem altijd voorafgegaan worden door een apenstaart. Paden worden in Windows vaak met het teken "" aangeduid. Dit teken is echter ook een stringcommando in C# (\n, \r, \t). Om het stringcommando uit te schakelen wordt de string voorafgegaan door dit apenstaart. Een andere manier is om echter die commando uit te schakelen door een dubbele slash te gebruiken ("\"). In dat geval wordt het apenstaart vooraan weggelaten. Hieronder wordt dezelfde string gebruikt op de 2 manieren.

// first way of decalring a string for path string path = @"E:\Bijlagen_WPO13\test.txt"; // second way to do it string path = "E:\\Bijlagen_WPO13\\test.txt";

CSV-formaat

Lezen, schrijven en data toevoegen zijn de basisbehandelingen die men kan uitvoeren op een bestand. Indien men veel data met een regelmatig patroon wenst op te slaan, kan het handig worden om een bepaalde opslagconventie te hanteren. Een voorbeeld van zo'n conventie is het CSV-formaat. Het CSV-formaat ("comma separated values") wordt gekenmerkt door het opslaan van data die gescheiden zijn door komma's. Door op elke regel maar een bepaalde set van waardes op te slaan, en dit zo op verschillende regels te hanteren, kan men grote datasets aanmaken. Zo bijvoorbeeld kunnen meetresultaten opgeslagen worden. Het CSV-formaat wordt als volgt toegepast: de eerste rij bevat de namen van de kolommen, waarij de namen gescheiden zijn door komma's. De volgende rijen bevatten de data (numerieke data, tekst, enz.), eveneens gescheiden door komma's.

Het lezen uit zo'n bestand verschilt niet veel van het lezen uit een random tekstbestand. Lees eerst regel per regel in. Als dit lukt, is de volgende stap het afzonderen van de data van de komma's. Hiervoor kan je de methode "Stringsplit" toepassen (met de komma als delimiter). Deze methode retourneert een aantal strings terug, waarbij het aantal overeenkomt met het aantal data per regel. Nu is het de moment om al deze afzonderlijke strings naar het juiste datatype om te zetten (int, float, double, enz.). De volgorde van de data (plaats in de regel) is hier zeer belangrijk, en wordt bepaald door de kolomnaam ("Caption").

Het schrijven naar een CSV-bestand kan op een eenvoudige wijze plaatsvinden. Voor elke regel maak je een lege string aan. Deze vul je op door alternerend de juiste waarde van van huidige kolom erin te schrijven, tesamen met een komma. Elke regel (string) sluit je af met een newline! Deze newline wordt bij het lezen gebruikt als einde voor de "Readln" methode, en duidt ook aan dat een gegeven dataset afgesloten is. Via de StreamWriter kan je de string toevoegen aan het bestand. Vergeet niet: de eerste regel bevat de kolomnamen!

Als voorbeeld wordt het uitlezen van een CSV-bestand gedemonstreerd. De code berekent het gemiddelde van alle waarden op eenzelfde lijn die door een kommas gescheiden worden.

// Open the file to read from. try { // generate string for the current file name // note the '@' at the beginning string path = @"E:\Bijlagen_WPO13\test.txt"; using (StreamReader sr = File.OpenText(path)) { string s = ""; int linenumber = 1; // read line by line until the end of file (s==null) // has been reached if ((s = sr.ReadLine())!=null) { // read caption here } while ((s = sr.ReadLine()) != null) { // split the values by ',' csv_values = s.Split(','); int sum=0; for (int i=0;i<csv_values.Length;i++) { int value = int.Parse(csv_values[i]); sum+=value; } int average = sum/csv_values.Length; txtOutput.Text += "Average on line " + linenumber + " = " + average.ToString() + "\n"; linenumber++; } } } catch (Exception ex) { MessageBox.Show(ex.Message); }