Elegantní zpracování CSV souborů v C# (LINQ)


V tomto článku se pokusím nastínit, jak využít možnosti, které nabízí C# s LINQ. Velkou výhodou tohoto postupu je, že díky anonymním typům na pár jednoduchých řádcích získáme velice dobře zpracované hodnoty z CSV (Comma-separated values – na oddělovači ovšem nezáleží) souboru, se kterými můžeme pracovat stejně snadno, jako s objekty.

Zadání

Postup se pokusím vysvětlit na jednoduchém scénáři – máme zadaný seznam zaměstnanců, u nichž je uveden věk. Tento seznam je zadán v CSV souboru (jako oddělovač je použit středník), například:

Jméno;Příjmení;Věk;
Miroslav;Veith;23;
Martin;Hlaváč;24;
...;...;...;
.
.
atd.

Obsah tohoto souboru chceme zpracovat a jednotlivé zaměstnance například vypsat do konzole – pouze na ukázku práce s daty načtenými ze souboru.

Zpracování

Přistoupím rovnou k ukázce kódu, která dle mého názoru hovoří za vše:

string[] csvFileLines = File.ReadAllLines("csvFile.csv");

var separator = ';';
var withHeader = true;

var employees = csvFileLines.Skip(withHeader ? 1 : 0).Select(line =>
    {
        var parts = line.Split(separator);
        return new
        {
            FirstName = parts[0],
            LastName = parts[1],
            Age = parts[2]
        };
    });

foreach (var employe in employees)
{
    Console.WriteLine
        (
            "{0} {1} - {2} let",
            employe.FirstName,
            employe.LastName,
            employe.Age
        );
}

Samozřejmě je možné použít i tento zápis, výsledek je stejný:

string[] csvFileLines = File.ReadAllLines("csvFile.csv");

var separator = ';';
var withHeader = true;
var employees = from line in csvFileLines.Skip(withHeader ? 1 : 0)
                let parts = line.Split(separator)
                select new
                {
                    FirstName = parts[0],
                    LastName = parts[1],
                    Age = parts[2]
                };

foreach (var employe in employees)
{
    Console.WriteLine
        (
            "{0} {1} - {2} let",
            employe.FirstName,
            employe.LastName,
            employe.Age
        );
}

Závěr

Na tomto příkladu je jasně vidět, že csv soubor se dá na pár řádcích načíst tak, že zpracování načtených dat je potom velice snadné a hlavně přímočaré. Další výhodou je dobrá čitelnost kódu.

, , ,

  1. #1 Dzony 28.1.2013 - 10:27

    Dobrý den, zajímalo by mě, pokud bude mít csv soubor několik tisíc záznamů, který z uvedených příkladů bude rychlejší a méně náročný na paměť?

    • #2 Miroslav Veith 29.1.2013 - 14:58

      Dobrý den. V obou případech by mělo jít o zcela stejně náročné/rychlé zpracování, protože jediný rozdíl je v zápisu. Takže jde jen o to, jaký zápis preferujete a který je pro Vás čitelnější…

Komentáře jsou uzavřeny.