Autor Téma: Práce s CSV  (Přečteno 2845 krát)

Offline Maros2470

  • Příspěvků: 8
  • Karma: 0
    • Verze Delphi: 7
Práce s CSV
« kdy: 13-02-2014, 17:17:31 »
Zdravím všechny.
Jsem úplný začátečník a proto potřebuji poradit se zpracováním csv souboru. Potřeboval bych z načteného csv vyseparovat po řádcích jednotlivé položky řádku, oddělené středníkem. Ideální by bylo toto dostat do jednotlivých sloupců a řádků v StringGrid.
Poradí mi někdo? Díky

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1672
  • Karma: 69
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Práce s CSV
« Odpověď #1 kdy: 14-02-2014, 08:46:35 »
Kód: Delphi [Vybrat]
  1. uses
  2.    Classes, StrUtils, Types;
  3. var
  4.   sl: TStringList;
  5.   s: string;
  6.   items: TStringDynArray;
  7. begin
  8.    sl:= TStringList.Create;
  9.    try
  10.    sl.LoadFromFile('neco.csv'); // nacti CSV
  11.    for y := 0 to sl.Count  -1 do
  12.    begin
  13.       items := SplitString(s, ';'); // rozsekej radek
  14.       for x := 0 to Length(items) - 1 do
  15.           stringgrid.cell[x+1,y+1] := items[x]; // napln policka
  16.    end;
  17.   finally
  18.     sl.Free;
  19.   end;
  20. end;
  21.    
  22.  

Pisu to z praku, tak snad ok. Jen se jeste u stringgridu musi nastavit rozsah radku a sloupcu dle CSV (tj. po tom LoadFromFile, pocet radku), a pocet sloupcu po prvnim SplitString.
Embarcadero MVP - Czech republic

RomanZ

  • Host
Re:Práce s CSV
« Odpověď #2 kdy: 14-02-2014, 09:31:27 »
Tohle mu možná bude stačit, ale úplně OK to není. Podle popisu tady na té stránce:

http://en.wikipedia.org/wiki/Comma-separated_values

...zejména dole v kapitole "Basic rules and examples", může text datové položky obsahovat oddělovač řádku. Taková datová položka musí být v uvozovkách. Radkovo řešení na takových datech pohoří, nicméně je velká šance, že tazatel takto komplikovaná data nemá a složitější řešení nepotřebuje.

Já jsem to řešil skoro jako Radek, akorát jsem ještě po načtení řádku musel kontrolovat, zda je na něm lichý počet uvozovek. Pokud byl, připojil jsem k řádku ještě oddělovač řádků a řádek následující. Teprve pak jsem parsoval podle oddělovače (středníku). Ale opět - po každé položce zkontrolovat, jestli není lichý počet uvozovek a pokud je, vrátit středník zpátky, připojit zbytek řádku a stříhat až na dalším středníku.

PS: V žádném případě nechci Radkovu odpověď kritizovat, naopak jsem vděčný že tu pomohl. Můj příspěvek berte prosím jako doplnění, aby si někdo nenabil ústa jako já před časem :)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1672
  • Karma: 69
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Práce s CSV
« Odpověď #3 kdy: 14-02-2014, 09:45:30 »
To máš pravdu, jen jsem se naslepo nechtěl pouštět do žádných větších akcí :-). Jinak ten splitstring by se mel nahradit necim jinym, protoze v pripade, ze by polozka obsahovala ; tak by byla v uvozovkach, jenze sazim na to, ze tak slozita vstupni data tazatel nema.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1733
  • Karma: 72
    • Verze Delphi: D2007, XE3, DX10
Re:Práce s CSV
« Odpověď #4 kdy: 14-02-2014, 09:54:54 »
To máš pravdu, jen jsem se naslepo nechtěl pouštět do žádných větších akcí :-). Jinak ten splitstring by se mel nahradit necim jinym, protoze v pripade, ze by polozka obsahovala ; tak by byla v uvozovkach, jenze sazim na to, ze tak slozita vstupni data tazatel nema.
IMHO mirne lepsi varianta nez SplitString by bylo pouzit TStringList.DelimitedText

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 803
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:Práce s CSV
« Odpověď #5 kdy: 14-02-2014, 11:34:09 »
Zkuste se podívat na komponent TPgCSV pro import csv do DB nebo jvCSVBase v.1.0 , lze s tím pracovat jako s DB tabulí. Nebo další viz http://www.torry.net/quicksearchd.php?String=csv&Title=Yes

Offline Maros2470

  • Příspěvků: 8
  • Karma: 0
    • Verze Delphi: 7
Re:Práce s CSV
« Odpověď #6 kdy: 14-02-2014, 16:00:48 »
Díky za rady, budu to zkoušet.

Offline oxo

  • Guru
  • *****
  • Příspěvků: 672
  • Karma: 37
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Práce s CSV
« Odpověď #7 kdy: 14-02-2014, 19:28:38 »
Já bych se radši doopravdy podíval, jestli není někde nějaké úplné řešení. Ono správně načíst obecné CSV není zas až tak simple.
Pokud je velikost CSV třeba několik stovek MB, není moc chytré ho načítat celý do paměti, pak se musí ošetřit uvozovky (nový řádek nebo separátor se mezi nimi taky může vyskytovat), pořešit to, aby to šlo trochu rychle atp...
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: