4 Triedenie riadkov v CSV súbore

Naprogramujte konzolovú aplikáciu na triedenie riadkov v CSV súbore. Bude mať tri pozičné parametre

  1. cesta k vstupnému súboru

  2. cesta k výstupnému súboru

  3. Reťazec určujúci, čísla stĺpcov (číslované od 1) a v akom poradí sa použijú na porovnanie, oddelené čiarkami napríklad 2,1,3

Ak dostanete iné parametre (počet), tak skončite s chybou (error kód >= 1).

Môžete predpokladať, že vstup aj výstup je obyčajné ASCII. Počet stĺpcov nie je daný, ale všetky riadky by mali mať rovnaký počet hodnôt, ak nebudú skončite s chybou. Riadky sú oddelené normálne novým riadkom a stĺpce čiarkou ,, hodnoty v stĺpcoch môžu byť aj prázdne. Rovnako skončite ak sa v treťom parameteri odkazuje na neexistujúci stĺpec. Neriešte, čo sa stane ak má stĺpec obsahovať čiarku (to bude až bonus).

Porovnanie hodnôt je textovo, tak ako sa porovnáva std::string, alebo strcmp. Obe metódy sú ekvivalentné.

Príklad vstupný súbor input.txt

1 2 3 4 5 1,a,a,aa, 2,b,a,aa,a 3,a,b,aa,b 4,a,a,aa,b 5,a,b,aa,b

Ak spustíme aplikáciu csv.exe input.txt output.txt 5,3 tak výstupný súbor output.txt môže byť

1 2 3 4 5 1,a,a,aa, 2,b,a,aa,a 4,a,a,aa,b 5,a,b,aa,b 3,a,b,aa,b

Rovnako by mohli byť aj posledné riadky vymenené (na poradí ekvivalentných nezáleží).

csv.exe input.txt output.txt 1,2,4,3 má výsledok zhodný s input.txt, lebo prvý stĺpec už dokonale určuje poradie.

csv.exe input.txt output.txt 1,1,2,1 , teda ak bude viacej rovnakých v stĺpov v definovaní usporiadania, tak treba skončiť s chybou (error level > 0).

Príklad vstupu s nejednotným počtom stĺpcov, kde treba tiež skončiť s chybou.

1 2 a,b,c,d a,b,c

Bonusový bod bude za implementáciu toho, že môže byť delimiter čiarka v rámci hodnoty stĺpca.

Ak implementujete bonus tak na parameter --quote musíte skončiť s nulovým error kódom.

Robí sa to tak, že hodnoty sa potom zatvárajú do úvodzoviek. Teda napríklad toto je korektný vstup.

1 2 3 a,"","treti parameter" b,",",c ", inside",,

Na výstup ale dávajte minimálne oescapovanie, teda string ”treti parameter” nemusí byť v úvodzovkách, nemá tam ,, preto ho na výstup ani nedávajte, stačí treti parameter. Teraz je otázka, čo ak má byť aj súčasťou hodnoty, vtedy ju zdvojíme.

1 """","a""b"

Prvá hodnota bude a druhá a”b. Vstupy, ktoré nie sú dobre oúvodzovkované treba odmietnuť s chybou.

1 ",this one is bad

Rovnako iba hodnota začínajúca úvodzovkou je oúvodozovkovaná, inak nie je, teda súbor

1 a"b, "a,aa"," a,a"

sa vyparsuje ako a”b, "a, aa” a a,a. Štandardne sa ešte rieši aj prípad, keď v rámci úvodzoviek sa vyskytuje nový riadok, to mi riešiť nebudeme, pre nás je každý nový riadok v súbore aj nový riadok v dátach.

Príklad pre bonus, znovu výsledok nemusí byť takýto istý, Môže mať inak riadky na ktorých nezáleží a tento príklad robí minimálne escapovanie, teda do úvodzoviek dáva iba to čo musí.

Vstup

1 2 3 4 5 1,"a",a,aa,d 2,b,a,"a,"",,a",a 3,a, "b,aa,b 4,a,"a""",aa,b 5,a,b,aa,b

Výstup

1 2 3 4 5 2,b,a,"a,"",,a",a 3,a, "b,aa,b 4,a,a",aa,b 5,a,b,aa,b 1,a,a,aa,d