Formát CSV (Comma Separated Values) je textový formát, který, jak jeho název napovídá, odděluje jednotlivé hodnoty čárkou. Kromě čárky jsou povolené i jiné oddělovače jako například středník.

Tento formát se používá pro uložení tabulkových dat (řádky × sloupce ) a je používaný mimo jiné pro export/import dat mezi aplikacemi. Jeho velkou výhodou je jednoduchost na čtení lidmi i strojové zpracování.

Podoba CSV

Tabulková podoba:

JménoVěkMěsto
Alice30Praha
Bob25Brno

CSV podoba:

Jméno,Věk,Město
Alice,30,Praha
Bob,25,Brno

Oddělovače

Pro oddělení hodnot lze využít čárku. V Evropě se preferuje využití středníku, a to z důvodu, že čárka se používá jako oddělovač desetinných čísel.

CSV podoba:

Jméno;Věk;Město
Alice;30;Praha
Bob;25;Brno

Význam uvozovek

Data mohou obsahovat znaky, které se shodují se zvoleným oddělovačem, ale neměla by být tak interpretována. Pro to lze využít uvozovky, které dokáží vyřešit když obsah obsahuje:

  • oddělovač
  • nový řádek
  • uvozovky
Jméno,Adresa
Alice,"Dlouhá 10, Praha"
Bob,"Krátká 5, Brno"

Pokud je uvnitř textu uvozovka, zapisuje se zdvojená:

Jméno,Popis
Alice,"Řekla ""Ahoj!"""

Práce s CSV v .NET

Pro jednoduchá CSV lze serializaci a deserializaci dat implementovat vlastnoručně, nicméně existují již existující implementace jako například CsvHelper.

Ukázka práce s CsvHelper

Na začátek je nutné si nainstalovat nuget balíček CsvHelper.

Model

public class Person
{
    public required string Name { get; set; }
    public required int Age { get; set; }
    public required string City { get; set; }
}

Serializace

var fileName = "people.csv";
 
var people = new List<Person>
{
	new Person { Name = "Alice", Age = 30, City = "Praha" },
	new Person { Name = "Bob", Age = 25, City = "Brno" }
};
 
using var writer = new StreamWriter(fileName);
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
 
csv.WriteRecords(people);
Name,Age,City
Alice,30,Praha
Bob,25,Brno

Warning

Ukázka pro zjednodušení neřeší správné ošetření výjimek. To je pro zajištění stability aplikace při práci se soubory na disku klíčové. Více v Výjimky.

Deserializace

var fileName = "people.csv";
 
using var reader = new StreamReader(fileName);
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
 
var records = csv.GetRecords<Person>().ToList();
 
foreach (var person in records)
{
	Console.WriteLine($"{person.Name} ({person.Age}) z města {person.City}");
}

Warning

Ukázka pro zjednodušení neřeší správné ošetření výjimek. To je pro zajištění stability aplikace při práci se soubory na disku klíčové. Více v Výjimky.