Lekce 4 - Uložení objektů do CSV ve VB.NET
V minulém dílu seriálu tutoriálů o VB.NET, Práce s textovými soubory ve VB.NET, jsme si ukázali zápis do textových souborů i jejich čtení.
Aplikace byla jednoduchá a spíše učebnicová. Udělejme si nyní opravdovou databázi uživatelů pomocí textových souborů. Ukládat budeme samozřejmě objekty, čili si program snadno předěláte na databázi upomínek v diáři, databázi nejlepších výsledků ve hře, databázi zvířat v chovné stanici a tak podobně.
Formát CSV
Nebudeme vymýšlet žádný složitý způsob ukládání dat do textových souborů, protože již jeden osvědčený a standardní existuje. Jmenuje se CSV (jako Comma Separated Values), tedy hodnoty oddělené čárkou, případně středníkem. O CSV jsme se zmínili v článku o metodách Split a Join na řetězci , dnes je tedy budeme potřebovat.
Pojďme se shodnout na tom, jak bude třída uživatele vypadat. Následně si ukážeme, jak její instance do CSV uložíme. Založte si nový projekt typu Windows Forms Application. Přidáme si k němu třídu Uzivatel. U uživatele budeme evidovat jeho jméno, věk a datum, kdy byl registrován. Konstruktor bude instanci tvořit na základě těchto 3 údajů. Přetížíme si metodu ToString tak, aby vypsala jméno uživatele. Třída tedy bude vypadat takto:
Public Class Uzivatel Private _jmeno As String Public Property Jmeno As String Get Return _jmeno End Get Private Set(ByVal value As String) _jmeno = value End Set End Property Private _vek As Integer Public Property Vek As Integer Get Return _vek End Get Private Set(ByVal value As Integer) _vek = value End Set End Property Private _registrovan As DateTime Public Property Registrovan() As DateTime Get Return _registrovan End Get Private Set(ByVal value As DateTime) _registrovan = value End Set End Property Public Sub New(jmeno As String, vek As Integer, registrovan As DateTime) Me.Jmeno = jmeno Me.Vek = vek Me.Registrovan = registrovan End Sub Public Overrides Function ToString() As String Return Jmeno End Function End Class
Pojďme si ukázat, jak budou uživatelé ve formátu CSV vypadat. Každý řádek bude reprezentovat jednoho uživatele. Vlastnosti uživatele budou odděleny středníky. Uživatel Pavel Slavík, kterému je 22 let a zaregistroval se 21.3.2000 by vypadal takto:
Pavel Slavík;22;21.3.2000
Na první pohled vidíme, že je soubor relativně jednoduše čitelný i když nezasvěcený se může jen domnívat, co je číslo 22 a k čemu se váže ono datum.
V souboru může být samozřejmě více uživatelů, tedy více řádků.
Třídu uživatele máme, protože však ctíme objektový návrh, vytvoříme si i třídu pro naši databázi. Ta bude obsahovat kolekci uživatelů, tvořenou instancí třídy List. Kolekce bude privátní a přidávání uživatelů (případně jejich mazání, vyhledávání a podobně) bude realizováno veřejnou metodou. Databáze bude konečně obsahovat metody k načtení CSV souboru a také k uložení obsahu databáze do souboru. Jméno souboru bude další privátní proměnná databáze. Přidejme si tedy k projektu další třídu Databaze a napišme její kostru:
Public Class Databaze Private uzivatele As List(Of Uzivatel) = New List(Of Uzivatel) Private soubor As String Public Sub New(soubor As String) End Sub Public Sub PridejUzivatele(jmeno As String, vek As Integer, registrovan As DateTime) End Sub Public Function VratVsechny() As List(Of Uzivatel) End Function Public Sub Uloz() End Sub End Class
VS nám End Function u VratVsechny podtrhne zeleně (protože nevrací hodnotu), ale toho si zatím nebudeme všímat. Pojďme postupně naimplementovat jednotlivé metody. Začněme konstruktorem.
V konstruktoru vytvoříme instanci Listu a uložíme si cestu k databázovému souboru:
Public Sub New(soubor As String) uzivatele = New List(Of Uzivatel) Me.soubor = soubor End Sub
To bylo velmi jednoduché a i na další metodě není co vymýšlet:
Public Sub PridejUzivatele(jmeno As String, vek As Integer, registrovan As DateTime) Dim u As Uzivatel = New Uzivatel(jmeno, vek, registrovan) uzivatele.Add(u) End Sub
Metoda VratVsechny() nám vrátí všechny uživatele. Podobně můžeme v budoucnu udělat metody pro vyhledávání jen některých uživatelů. Uživatele navrátíme ve formě pole.
Public Function VratVsechny() As Uzivatel() Return uzivatele.ToArray() End Function
Uložení uživatelů do CSV
Nyní se konečně dostáváme k práci s CSV souborem. Začneme using blokem s instancí StreamWriteru. Uvnitř proiterujeme náš List uživatelů a pro každého uživatele vytvoříme pole Stringů z jeho vlastností. Nestringové vlastnosti musíme na String explicitně převést. Pole poté spojíme na dlouhý String, ve kterém budou položky oddělené středníky. Spojení za nás vykoná metoda Join. Ta se narozdíl od metody Split volá přímo na třídě String a jako parametr (spojovací text) bere také String, nikoli Char. Pusťme se do toho:
Public Sub Uloz() 'Otevření souboru pro zápis Using sw As New StreamWriter(soubor) 'projetí uživatelů For Each u As Uzivatel In uzivatele 'vytvoření pole hodnot Dim hodnoty() As String = {u.Jmeno, u.Vek.ToString(), u.Registrovan.ToShortDateString()} 'vytvoření řádku Dim radek As String = String.Join(";", hodnoty) 'zápis řádku sw.WriteLine(radek) Next 'vyprázdnění bufferu sw.Flush() End Using End Sub
Kdybychom u data registrace ponechali jen ToString(), uložil by se nám i čas, což zde není příhodné. Pojďme si vše vyzkoušet, přejděme k souboru Formuláře (Form1.vb, případně v designeru F7). Zavedeme privátní proměnnou databaze, do které v konstruktoru formuláře vytvoříme instanci naší databáze:
Private databaze As Databaze Public Sub New() ' This call is required by the designer. InitializeComponent() databaze = New Databaze("uzivatele.csv") End Sub
Na formulář přidejme nové tlačítko, pojmenujme ho tlacitkoUlozit a Text mu nastavme na Uložit.

V jeho Click handleru (vytvoří se po dvojkliku na tlačítko) přidáme do databáze 2 uživatele. Bude to nyní pro vyzkoušení, později bude aplikace vypadat lépe. Dále celou databázi uložíme do souboru.
Private Sub tlacitkoUlozit_Click(sender As Object, e As EventArgs) Handles tlacitkoUlozit.Click databaze.PridejUzivatele("Pavel Slavík", 22, New DateTime(2000, 3, 21)) databaze.PridejUzivatele("Jan Novák", 31, New DateTime(2012, 10, 30)) databaze.Uloz() End Sub
Aplikaci spustíme a klikneme na tlačítko. Nyní otevřeme (např. v NotePadu) soubor uzivatele.csv (ve složce s projektem/bin/debug) a vidíme, že má následující obsah:
Pavel Slavík;22;21.3.2000 Jan Novák;31;30.10.2012
Vše tedy funguje, jak má .
Načtení uživatelů a dokončení aplikace si necháme na příště, Uložení objektů do CSV ve VB.NET část 2.