Office week Slevový týden - Květen
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

4. diel - Uloženie objektov do CSV v C #

V minulej lekcii, Práca s textovými súbormi v C # , 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 alebo na čokoľvek, čo budete potrebovať evidovať.

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 inicializovať na základe týchto 3 vlastností. Prepíšeme si metódu ToString() tak, aby vrátila meno používateľa. Trieda teda bude vyzerať takto:

class Uzivatel
{
    public string Jmeno { get ; private set; }
    public int Vek { get; private set; }
    public DateTime Registrovan { get; private set; }

    public Uzivatel(string jmeno, int vek, DateTime registrovan)
    {
        Jmeno = jmeno;
        Vek = vek;
        Registrovan = registrovan;
    }

    public override string ToString()
    {
        return Jmeno;
    }

}

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.

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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ými metódami. 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 atribút databázy. Pridajme si teda k projektu ďalšiu triedu Databaze a nápis jej kostru:

class Databaze
{
    private List<Uzivatel> uzivatele;
    private string soubor;

    public Databaze(string soubor)
    {
    }

    public void PridejUzivatele(string jmeno, int vek, DateTime registrovan)
    {
    }

    public Uzivatel[] VratVsechny()
    {
    }

    public void Uloz()
    {
    }

    public void Nacti()
    {
    }
}

Visual Studio nám metódu VratVsechny() podčiarkne červeno (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 List a uložíme si cestu na databázový súboru:

public Databaze(string soubor)
{
    uzivatele = new List<Uzivatel>();
    this.soubor = soubor;
}

To bolo veľmi jednoduché a aj na ďalšie metóde nie je čo vymýšľať:

public void PridejUzivatele(string jmeno, int vek, DateTime registrovan)
{
    Uzivatel u = new Uzivatel(jmeno, vek, registrovan);
    uzivatele.Add(u);
}

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 Uzivatel[] VratVsechny()
{
    return uzivatele.ToArray();
}

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 stringov 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 void Uloz()
{
    // otevření souboru pro zápis
    using (StreamWriter sw = new StreamWriter(soubor))
    {
        // projetí uživatelů
        foreach (Uzivatel u in uzivatele)
        {
            // vytvoření pole hodnot
            string[] hodnoty = { u.Jmeno, u.Vek.ToString(), u.Registrovan.ToShortDateString() };
            // vytvoření řádku
            string radek = String.Join(";", hodnoty);
            // zápis řádku
            sw.WriteLine(radek);
        }
        // vyprázdnění bufferu
        sw.Flush();
    }
}

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.cs, prípadne v Designeri F7). Tu vytvoríme privátne atribút databaze, do ktorého v konstruktoru formulára uložíme novú inštanciu našej databázy:

private Databaze databaze;

public Form1()
{
    InitializeComponent();
    databaze = new Databaze("uzivatele.csv");
}

Na formulár pridajme nové tlačidlo, pomenujte ho tlacitkoUlozit a Text mu nastavme na "Uložit".

Formulár pre uloženie do CSV v C #

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 void tlacitkoUlozit_Click(object sender, EventArgs e)
{
    databaze.PridejUzivatele("Pavel Slavík", 22, new DateTime(2000, 3, 21));
    databaze.PridejUzivatele("Jan Novák", 31, new DateTime(2012, 10, 30));
    databaze.Uloz();
}

Aplikáciu spustíme a klikneme na tlačidlo. Teraz otvoríme (napr. V notepad) súbor uzivatele.csv (vo složka s projektem/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 budúci lekciu, Uloženie objektov do CSV v C # časť 2 .


 

 

Článok pre vás napísal David Čápka
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sa informačné technológie naučil na Unicorn College - prestížnej súkromnej vysokej škole IT a ekonómie.
Predchádzajúci článok
Práca s textovými súbormi v C #
Všetky články v sekcii
Práca so súbormi v C #
Miniatúra
Nasledujúci článok
Uloženie objektov do CSV v C # časť 2
Aktivity (1)

 

 

Komentáre

Avatar
Michal Štěpánek:21.4.2016 21:29

Trošku to upřesni, jak často chceš data měnit, přidávat, mazat, jak často se v nich chceš vrtat, vyhledávat, kolik jich cca může být celkem, co se s nimi má dít po uložení, nebo po načtení, atd...
Podle toho se pak odvíjí způsoby ukládání dat.

Odpovedať
21.4.2016 21:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovedá na Michal Štěpánek
Kotyza Lukáš:21.4.2016 22:52

No potřeboval bych je načíst při otevření do numericupdownu, data změnit, uložit a zavřít to je vše

PS:nejlepší by bylo kdyby se uložili po každé změně ale to není nutné

 
Odpovedať
21.4.2016 22:52
Avatar
Odpovedá na Kotyza Lukáš
Michal Štěpánek:21.4.2016 23:55

V tom případě je úplně šumák, jestli použiješ csv, txt nebo xml

Odpovedať
21.4.2016 23:55
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
 
Odpovedať
22.4.2016 17:11
Avatar
Peter Sciranka
Redaktor
Avatar
Peter Sciranka:30.12.2016 12:24

V metóde ulož by malo byť asi uloženie do súboru: @"soubor.csv" (teraz tam máš txt, takže sa to uloží do txt.) Ak to tak nie, tak prosím o vysvetlenie. Inak Ďakujem za tutoriály, sú super.

Odpovedať
30.12.2016 12:24
Act as if it was Impossible to Fail
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Peter Sciranka
Redaktor
Avatar
Peter Sciranka:30.12.2016 12:37

Urobil som to presne podľa tutoriálu, ale nerobil som to vo Win Forms ale vo WPF, a tam sa ten subor uzivatele.csv nevytvorí, vytvorí sa len soubor.txt. Tak neviem či robím niekde chybu ja, či to bude tým WPF.

Odpovedať
30.12.2016 12:37
Act as if it was Impossible to Fail
Avatar
Odpovedá na Peter Sciranka
Michal Štěpánek:30.12.2016 22:54

WPFkem to určitě nebude. Stáhni si přiložený soubor a zkontroluj si, kde máš chybku...

Odpovedať
30.12.2016 22:54
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lukas C#
Redaktor
Avatar
Odpovedá na Peter Sciranka
Lukas C#:31.12.2016 9:28

Přípona je jenom součástí jména souboru. Mohlo by tam být klidně i ".abcd". O formátu rozhoduje metoda StreamWriter.Wri­teLine(), která zapíše čistý text.

Takže formálně: Formát souboru je "plain-text", a způsob uložení dat je "comma-separated-values" - text, kde jsou hodnoty dělené čárkou, aby se daly snadno načítat a parsovat.

 
Odpovedať
31.12.2016 9:28
Avatar
ostrozan
Redaktor
Avatar
Odpovedá na Peter Sciranka
ostrozan:31.12.2016 16:22

Být tebou tak tady nad tím moc nedumám, protože nevím jak ostatní ale já používám výhradně třídu FileStream a její metody - je jich spousta - m.j. asynchronní čtení-zápis dat - nutné u větších objemů dat a spoustu dalších

navíc si můžeš jakýkoliv soubor vytvořit metodou File.Create("ces­ta\k\tvemu\sou­boru.csv");

 
Odpovedať
31.12.2016 16:22
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovedá na ostrozan
Peter Sciranka:4.1.2017 15:12

Ďakujem krásne všetkým za vysvetlenie a rady a prajem všetko dobré do nového roku.

Odpovedať
4.1.2017 15:12
Act as if it was Impossible to Fail
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!