Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Formulář pro uložení do CSV ve Visual Basic .NET - Soubory ve VB.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ě, Uložení objektů do CSV ve VB.NET část 2.


 

Předchozí článek
Práce s textovými soubory ve VB.NET
Všechny články v sekci
Soubory ve VB.NET
Přeskočit článek
(nedoporučujeme)
Uložení objektů do CSV ve VB.NET část 2
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
6 hlasů
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.
Aktivity