Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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

V minulej lekcii, Práca s textovými súbormi v C# .NET, sme si ukázali zápis do textových súborov aj ich čítanie. Prebrali sme triedy StreamWriter a StreamReader.

V dnešnom tutoriále Súbory v C# .NET vytvoríme plne objektovú formulárovú aplikáciu s databázou užívateľov, ktorá ukladá inštancie do textových súborov vo formáte CSV.

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 lekcii Textové reťazce v C# do tretice - Split a Join, dnes ich teda budeme potrebovať.

Založenie aplikácie

Poďme sa zhodnúť na tom, ako bude trieda používateľa vyzerať. Následne si ukážeme, ako jej inštancie do CSV uložíme. Založme si novou aplikáciu typu Windows Forms Application.

Trieda User

Poďme sa zhodnúť na tom, ako bude trieda používateľa vyzerať. Následne si ukážeme, ako jej inštancie do CSV uložíme. 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 troch vlastností. Prepíšeme si metódu ToString() tak, aby vrátila meno používateľa. Trieda teda bude vyzerať takto:

class User
{
    /// <summary>
    /// Full name
    /// </summary>
    public string Name { get; private set; }
    /// <summary>
    /// Age
    /// </summary>
    public int Age { get; private set; }
    /// <summary>
    /// Registration date
    /// </summary>
    public DateTime Registered { get; private set; }

    /// <summary>
    /// Initializes a new user instance
    /// </summary>
    /// <param name="name">Full name</param>
    /// <param name="age">Age</param>
    /// <param name="registered">Registration date</param>
    public User(string name, int age, DateTime registered)
    {
        Name = name;
        Age = age;
        Registered = registered;
    }

    /// <summary>
    /// Returns the text representation of the user
    /// </summary>
    /// <returns>The text representation of the user</returns>
    public override string ToString()
    {
        return Name;
    }

}

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ď nezasvätený 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 použí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.

Trieda Database

Trieda Database bude obsahovať kolekciu užívateľov, tvorenú inštanciou triedy List. Kolekcia bude privátna 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átny atribút databázy. Pridajme si teda k projektu ďalšiu triedu Database a napíšme jej kostru:

class Database
{
    private List<User> users;
    private string file;

    public Database(string file)
    {
    }

    public void AddUser(string name, int age, DateTime registered)
    {
    }

    public User[] ReturnAll()
    {
    }

    public void Save()
    {
    }

    public void Load()
    {
    }
}

Visual Studio nám metódu ReturnAll() podčiarkne na červeno (pretože nevracia hodnotu), ale to si zatiaľ nebudeme všímať. Poďme postupne naimplementovať jednotlivé metódy. Začnime konštruktorom.

Konštruktor

V konštruktore vytvoríme inštanciu List a uložíme si cestu k databázovému súboru:

/// <summary>
/// Initializes a new instance
/// </summary>
/// <param name="file">The path to the database file</param>
public Database(string file)
{
    users = new List<User>();
    this.file = file;
}

To bolo veľmi jednoduché.

Metóda AddUser()

Na ďalšej metóde tiež nie je čo vymýšľať:

/// <summary>
/// Adds a new user into the database
/// </summary>
/// <param name="name">Full name</param>
/// <param name="age">Age</param>
/// <param name="registered">Registration date</param>
public void AddUser(string name, int age, DateTime registered)
{
    User u = new User(name, age, registered);
    users.Add(u);
}

Metóda ReturnAll()

Metóda ReturnAll() nám vráti všetkých užívateľov. Podobne môžeme v budúcnosti urobiť metódy na vyhľadávanie len niektorých užívateľov. Užívateľa navrátime vo forme poľa:

/// <summary>
/// Returns all the users in the database
/// </summary>
/// <returns>All the users in the database</returns>
public User[] ReturnAll()
{
    return users.ToArray();
}

Uloženie užívateľov do CSV

Teraz sa konečne dostávame k práci s CSV súborom.

Metóda Save()

Začneme using blokom s inštanciou StreamWriter. Vnútri preiterujeme náš list používateľov a pre každého použí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 aj string, nie char. Pusťme sa do toho:

public void Save()
{
    using (StreamWriter sw = new StreamWriter(file))
    {
        foreach (User u in users)
        {
            string[] values = { u.Name, u.Age.ToString(), u.Registered.ToShortDateString() };
            string line = String.Join(";", values);
            sw.WriteLine(line);
        }
        sw.Flush();
    }
}

Keby sme pri dátume registrácie ponechali len ToString(), uložil by sa nám aj čas, čo tu nie je príhodné.

Formulár Form1

Poďme si všetko vyskúšať, prejdime k súboru formuláre Form1.cs, prípadne v designeri přes F7. Tu vytvoríme privátny atribút database, do ktorého v konštruktore formulára uložíme novú inštanciu našej databázy:

private Databaze database;

public Form1()
{
    InitializeComponent();
    database = new Database("users.csv");
}

Na formulár pridajme nové tlačidlo, pomenujme ho saveButton a Text mu nastavme na "Save".

Formulár na uloženie do CSV v C# - Súbory v C# .NET

V jeho Click handleri (vytvorí sa po dvojkliku na tlačidlo) pridáme do databázy dvoch užívateľov. Bude to teraz na vyskúšanie, neskôr bude aplikácia vyzerať lepšie. Ďalej celú databázu uložíme do súboru:

private void SaveButton_Click(object sender, EventArgs e)
{
    database.AddUser("John Smith", 22, new DateTime(2000, 3, 21));
    database.AddUser("John Brown", 31, new DateTime(2012, 10, 30));
    database.Save();
}

Testovanie

Aplikáciu spustíme a klikneme na tlačidlo. Teraz otvoríme (napríklad v NotePade) súbor users.csv (v priečinok s aplikáciou/bin/debug) a vidíme, že má nasledujúci obsah:

John Smith;22;3/21/2000
James Brown;31;10/30/2012

Všetko teda funguje, ako má :)

Načítanie užívateľov a dokončenie aplikácie si necháme na budúcu lekciu, Uloženie objektov do CSV v C# .NET - Dokončenie.


 

Mal si s čímkoľvek problém? Zdrojový kód vzorovej aplikácie je k stiahnutiu každých pár lekcií. Zatiaľ pokračuj ďalej, a potom si svoju aplikáciu porovnaj so vzorom a ľahko opráv.

Predchádzajúci článok
Práca s textovými súbormi v C# .NET
Všetky články v sekcii
Súbory v C# .NET
Preskočiť článok
(neodporúčame)
Uloženie objektov do CSV v C# .NET - Dokončenie
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity