4. díl - Uložení objektů do CSV ve VB.NET

Ostatní jazyky Visual Basic .NET Práce se soubory Uložení objektů do CSV ve VB.NET

V minulém dílu seriálu tutoriálů o 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.

Formulář pro uložení do CSV ve Visual Basic .NET

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/de­bug) 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ě.


 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!