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
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ľ John Smith, ktorému je 22 rokov a zaregistroval sa 21.3.2000 by vyzeral takto:
John Smith;22;3/21/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áš zoznam 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
:
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 project/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.