Načítanie CSV súboru v C#

Publikoval Michal Kočí dňa 15.9.2004 o 17:58 v kategórii .Net

K tomuto príspevku ma inšpiroval dotaz v .Net konerencii na servery www.builder.cz kde padol dotaz ako načítať CSV súbor. Padli tam niektoré riešenia, ktoré majú svoje výhody, ale aj nevýhody. Obe riešenia otvoria súbor a čítajú riadky a parsujú každý riadok použitím metódy Split triedy String. Problém nastane, ak je v CSV niektorá položka uzatvorená do uvodzoviek - deje sa tak, ak položka obsahuje oddelovač (ak je oddelovačom bodkočiarka tak ak položka obsahuje bodkočiarku, musí sa položka uzatvoriť do úvodzoviek)

Iný spôsob načítania CSV súbor, ktorý týmto neduhom netrpí je použitie OleDb tried a použiť Jet provider (tento provider vie interne použiť IISAM driver). IISAM driver Text zvláda prístup k CSV súboru, avšak tiež má isté obmedzenia: riadky nemôžu byť odstranované ani editované. Ovšem na načítanie CSV súboru toto riešenie úplne postačí.

Celý postup je viac než jednoduchý a veľmi obdobný prístupu k Access databáze. O CSV súbore vieme, že sú položky oddelené (delimited) a že prvý riadok obsahuje názvy stĺpcov. Určite vieme aj adresár, kde sa CSV súbor nachádza no a samozrejme že vieme aj názov CSV súboru. Všetko potrebné za nás vyrieši Jet provider:

Metóda ktorá načíta CSV súbor a vráti DataSet (v tomto prípade kanón na vrabce, ale ako ukážka stačí) môže vyzerať napríklad nasledovne:

private DataSet DataSetFromCSV(string directory, string csvFile)
{
    string connectionString =
        "Provider=Microsoft.Jet.OLEDB.4.0;" +
        "Data Source=" + directory + ";" +
        "Extended Properties=\"text;HDR=Yes;FMT=Delimited\"";
    string selectCommand = "select * from " + csvFile;

    OleDbConnection oCon = new OleDbConnection(connectionString);
    OleDbDataAdapter oDa = new OleDbDataAdapter(selectCommand, oCon);

    DataSet ds = new DataSet();
    oDa.Fill(ds);

    return ds;
}

Všimnite si, že v pripojovacom reťazci definujeme IISAM driver v Extended Properties. Určujeme tu tiež, že prvý riadok obsahuje názvy stĺpcov a že súbor obsahuje hodnoty oddelené oddelovačom. Môžeme toto rozhodnutie nechať aj na IISAM driver, ten pri rozhodovaní načíta prvých 25 riadkov a na základe nich sa snaží rozhodnúť o aký formát súboru sa jedná. Toto chovanie iste poznáte, ak ste niekedy importovali textový súbor do Excelu a viete, že jeho schopnosti sú niekedy očarujúce :)

No a finálne stačí zavolať nami vytvorenú metódu, napríklad pri zobrazení dát v DataGrid-e:

dataGrid1.DataSource = DataSetFromCSV("c:\temp", "book1.csv");

Mimochodom, ak by ste v budúcnosti zabudli na formát pripojovacieho reťazca, skočte sa pozrieť na ConnectionStrings.Com, je veľká pravdepodobnosť, že ho tam nájdete.

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.