4. diel - Uloženie objektov do CSV vo VB.NET
V minulom dieli seriálu tutoriálov o VB.NET, Práca s textovými súbormi vo VB.NET , sme si ukázali zápis do textových súborov aj ich čítanie.
Aplikácia bola jednoduchá a skôr učebnicová. Urobme si teraz naozajstnú databázu užívateľov pomocou textových súborov. Ukladať budeme samozrejme objekty, čiže si program ľahko prerobíte na databázu upomienok v diári, databáze najlepších výsledkov v hre, databázu zvierat v chovnej stanici a tak podobne.
Formát CSV
Nebudeme vymýšľať žiadny zložitý spôsob ukladania dát do textových súborov, pretože už jeden osvedčený a štandardné existuje. Volá sa CSV (ako Comma Separated Values), teda hodnoty oddelené čiarkou, prípadne bodkočiarkou. O CSV sme sa zmienili v článku o metódach Split a Join na reťazci, dnes je teda budeme potrebovať.
Poďme sa zhodnúť na tom, ako bude trieda užívateľa vyzerať. Následne si ukážeme, ako jej inštancie do CSV uložíme. Založte si nový projekt typu Windows Forms Application. Pridáme si k nemu triedu Uzivatel. U užívateľa budeme evidovať jeho meno, vek a dátum, kedy bol registrovaný. Konštruktor bude inštanciu tvoriť na základe týchto 3 údajov. Preťažíme si metódu toString tak, aby vypísala meno používateľa. Trieda teda bude vyzerať 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
Poďme si ukázať, ako budú používatelia vo formáte CSV vyzerať. Každý riadok bude reprezentovať jedného používateľa. Vlastnosti užívateľa budú oddelené bodkočiarkami. Užívateľ Pavel Slavík, ktorému je 22 rokov a zaregistroval sa 21.3.2000 by vyzeral takto:
Pavel Slavík;22;21.3.2000
Na prvý pohľad vidíme, že je súbor relatívne jednoducho čitateľný aj keď Nezainteresovaný sa môže len domnievať, čo je číslo 22 a na čo sa viaže ono dátum.
V súbore môže byť samozrejme viac užívateľov, teda viac riadkov.
Triedu užívateľa máme, pretože však ctíme objektový návrh, vytvoríme si aj triedu pre našu databázu. Tá bude obsahovať kolekciu užívateľov, tvorenou inštancií triedy List. Kolekcia bude privátne a pridávanie užívateľov (prípadne ich mazanie, vyhľadávanie a podobne) bude realizované verejným spôsobom. Databáza bude konečne obsahovať metódy na načítanie CSV súboru a tiež na uloženie obsahu databázy do súboru. Meno súboru bude ďalší privátnej premenná databázy. Pridajme si teda k projektu ďalšiu triedu Databaze a nápis 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 podčiarkne zelene (pretože nevracia hodnotu), ale toho si zatiaľ nebudeme všímať. Poďme postupne naimplementovať jednotlivé metódy. Začnime konstruktoru.
V konstruktoru vytvoríme inštanciu Listu a uložíme si cestu na databázový súboru:
Public Sub New(soubor As String) uzivatele = New List(Of Uzivatel) Me.soubor = soubor End Sub
To bolo veľmi jednoduché a aj na ďalšie metóde nie je čo vymýšľať:
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
Metóda VratVsechny () nám vráti všetkých užívateľov. Podobne môžeme v budúcnosti urobiť metódy pre vyhľadávanie len niektorých užívateľov. Užívateľa vrátime vo forme poľa.
Public Function VratVsechny() As Uzivatel() Return uzivatele.ToArray() End Function
Uloženie užívateľov do CSV
Teraz sa konečne dostávame k práci s CSV súborom. Začneme using blokom s inštanciou StreamWriter. Vnútri proiterujeme náš List užívateľov a pre každého užívateľa vytvoríme pole String z jeho vlastností. Nestringové vlastnosti musíme na String explicitne previesť. Pole potom spojíme na dlhý String, v ktorom budú položky oddelené bodkočiarkami. Spojenie za nás vykoná metóda Join. Tá sa na rozdiel od metódy Split volá priamo na triede String a ako parameter (spojovací text) berie tiež String, nie Char. Pusťme sa 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
Keby sme u dátumu registrácie ponechali len toString (), uložil by sa nám aj čas, čo tu nie je príhodné. Poďme si všetko vyskúšať, prejdime k súboru Formuláre (Form1.vb, prípadne v Designeri F7). Zavedieme privátne premennú databazy, do ktorej v konstruktoru formulára vytvoríme inštanciu našej databázy:
Private databaze As Databaze Public Sub New() ' This call is required by the designer. InitializeComponent() databaze = New Databaze("uzivatele.csv") End Sub
Na formulár pridajme nové tlačidlo, pomenujte ho tlacitkoUlozit a Text mu nastavme na Uložiť.
V jeho Click Handler (vytvorí sa po dvojkliku na tlačidlo) pridáme do databázy 2 používateľa. Bude to teraz pre vyskúšanie, neskôr bude aplikácia vyzerať lepšie. Ďalej celú databázu uložíme do súboru.
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
Aplikáciu spustíme a klikneme na tlačidlo. Teraz otvoríme (napr. V notepad) súbor uzivatele.csv (v priečinku s projektom / bin / debug) a vidíme, že má nasledujúci obsah:
Pavel Slavík;22;21.3.2000 Jan Novák;31;30.10.2012
Všetko teda funguje, ako má .
Načítanie užívateľov a dokončenie aplikácie si necháme na nabudúce, Uloženie objektov do CSV vo VB.NET časť 2 .