Parsování souboru csv

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Parsování souboru csv
« Odpověď #15 kdy: 19. 02. 2013, 21:38:11 »
Ja tam hlavne ctu:

  1.  Each record is located on a separate line, delimited by a line
       break (CRLF).  For example:

       aaa,bbb,ccc CRLF
       zzz,yyy,xxx CRLF

CSV podle bodu 6. je prakticke, jak hrabe do postele a pokud vite o aplikaci, ktera toho vyuziva, tak by me zajimalo, jaka. Clovek by nejspise akorat narazil na problem s importem do vetsiny ostatnich aplikaci a parsovat to skriptem by byl pekny svrab. Mozna, ze to nekde existuje, ale nemyslim si, ze by to bylo obvykle.


Radek Miček

Re:Parsování souboru csv
« Odpověď #16 kdy: 19. 02. 2013, 21:47:01 »
Citace
parsovat to skriptem by byl pekny svrab

Napsat CSV parser (v rozumném jazyce), který to rozparsuje, je úkol na méně než 10 řádků.

Citace
Mozna, ze to nekde existuje, ale nemyslim si, ze by to bylo obvykle.

Přijde mi to docela normální (třeba pro uložení ceníku s popisem produktů).

neruda

Re:Parsování souboru csv
« Odpověď #17 kdy: 19. 02. 2013, 22:02:19 »
Citace
parsovat to skriptem by byl pekny svrab

Napsat CSV parser (v rozumném jazyce), který to rozparsuje, je úkol na méně než 10 řádků.

Citace
Mozna, ze to nekde existuje, ale nemyslim si, ze by to bylo obvykle.

Přijde mi to docela normální (třeba pro uložení ceníku s popisem produktů).

hmmm pokud dovedete nahradit treba opencsv 10ti radky, tak jste machr,
jinak zas jenom prilis sebevedomy smudla

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #18 kdy: 19. 02. 2013, 22:03:16 »
CRLF na konci řádku znamená že:
Řádek se dá načíst pomocí metody ReadLine, která čte od začátku řádku až po CRLF.

Until(EOF) {ParseRecord(ReadLine(FromStream));}

Případně testovat jednoduše na EOL.

Jde to tedy jednoduše zpracovat, celý soubor načteš jedním řádkem kódu a všechno udělá parser.
Pokud by CSV obsahovalo CRLF, tak by se to muselo načíst proudem a zpracovávat daleko složitěji.
Proto jsem ještě CRLF v CSVčku nikde neviděl.  ::)

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #19 kdy: 19. 02. 2013, 22:10:03 »
Machr napsal:
Přijde mi to docela normální (třeba pro uložení ceníku s popisem produktů).

jinak zas jenom prilis sebevedomy smudla

Pane Nerudo, nebuďte nerudný, vy snad nevidíte ty znalosti?!?
Dokonce ví, že popis produktů se podle HTML verze 6 odděluje zase jako v DOS pomocí CRLF a už ne
. :o
Pic kozu do vazu!


JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Parsování souboru csv
« Odpověď #20 kdy: 19. 02. 2013, 22:11:00 »
Citace
Mozna, ze to nekde existuje, ale nemyslim si, ze by to bylo obvykle.

Přijde mi to docela normální (třeba pro uložení ceníku s popisem produktů).

Nicmene se asi shodneme na tom, co jsem rekl vyse: Neni to obvykle. Popiralo by to jaksi vyhody jednoduchosti CSV. Pokud musite exportovat neco, kde naprosto nutne musi byt prechody na novy radek a nemuzete je treba nahradit nejakou nesmyslnou kombinaci znaku, kterou si za tim ucelem vymyslite, asi byste udelal lepe, kdybyste zvolil jiny format.

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #21 kdy: 19. 02. 2013, 22:11:53 »
Jde to tedy jednoduše zpracovat, celý soubor načteš jedním řádkem kódu a všechno udělá parser.
Pokud by CSV obsahovalo CRLF, tak by se to muselo načíst proudem a zpracovávat daleko složitěji.
Proto jsem ještě CRLF v CSVčku nikde neviděl.  ::)

Chybí mi edit ::)
Samozřejmě myslím CRLF mimo konce řádek, jinak jsem samozřejmě v CSVčkách CRLF viděl  ;D

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #22 kdy: 19. 02. 2013, 22:13:56 »
Nicmene se asi shodneme na tom, co jsem rekl vyse: Neni to obvykle. Popiralo by to jaksi vyhody jednoduchosti CSV. Pokud musite exportovat neco, kde naprosto nutne musi byt prechody na novy radek a nemuzete je treba nahradit nejakou nesmyslnou kombinaci znaku, kterou si za tim ucelem vymyslite, asi byste udelal lepe, kdybyste zvolil jiny format.

Járo, konce řádek v popisu zboží eshopu se budou nejspíš oddělovat pomocí značky
 ;)

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Parsování souboru csv
« Odpověď #23 kdy: 19. 02. 2013, 22:25:30 »
To je jedno, at si je kazdy oddeluje, cim chce. Ale ten clovek tam naprosto nutne potreboval mit CRLF, tak at si ho tam ma.

Radek Miček

Re:Parsování souboru csv
« Odpověď #24 kdy: 19. 02. 2013, 22:36:01 »
Citace
hmmm pokud dovedete nahradit treba opencsv 10ti radky, tak jste machr,
jinak zas jenom prilis sebevedomy smudla

Nesliboval jsem, že nahradím nějakou knihovnu.

Následující kód zvládne rozparsovat CSV (je tolerantnější než RFC - jako oddělovač záznamů povoluji i samotné CR nebo LF, neboť Libre Office používá samotné LF):

Kód: [Vybrat]
import Control.Applicative ((<*), pure)
import Text.ParserCombinators.Parsec

csv = record `sepEndBy` (try (string "\r\n") <|> pure "" <* oneOf "\n\r") <* eof
record = (quoted <|> (many (noneOf ",\n\r\""))) `sepBy` char ','
quoted = between (char '"') (char '"') $
         many (noneOf "\"" <|> try (string "\"\"" >> pure '"'))

Použití:

Kód: [Vybrat]
pure (parse csv "") <*> readFile "pok.csv"

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Parsování souboru csv
« Odpověď #25 kdy: 19. 02. 2013, 22:41:54 »
Tak jo. A ted jeste jednou v Bashi. :-)

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #26 kdy: 19. 02. 2013, 23:08:58 »
V BASHI a bez použití CRLF resp. LF pro Linux jako oddělovače řádku a nesmí to vypadat jako program v BrainFucku ani nabobtnat víc než o pár řádek.

Re:Parsování souboru csv
« Odpověď #27 kdy: 19. 02. 2013, 23:53:43 »
Jinak často stačí i jen jednoduchá úprava parseru, kdy se jako delimiter (oddělovač) použije středník ;
Jak říká heslo konzervativců, "i po staru se dá žít!" :) Škoda, že pro samé debaty, jestli je praktičtější čárka, středník nebo srdíčko, se často zapomíná, že ASCII má netisknutelné znaky FS, GS, RS, US (file separator, group separator, atd.), které jsou určené přesně na tohle a pravděpodobnost, že se vyskytnou někde v textu, je dost malá (bacha ale na Unicode, to je prevít!). Nikdy nebude nulová, ale bude výrazně menší než u jakéhokoli tisknutelného znaku. To už si musí každý zvážit sám, jakou úroveň neprůstřelnosti potřebuje...

Jinak k té vášnivé debatě okolo CSV, myslím, že se tady míchají dohromady dvě věci:
1. CSV jako to, co je definováno zmíněným standardem
2. poor man CSV, čili "to je přece když jako oddělovač mám čárku"

To první se ani zdaleka nedá parsovat rozdělením podle oddělovače, protože zná hodnotu v uvozovkách (což je přesně ten háček, na kterým jste se v tom mariáši s citacemi RFCčka chytili...)

Pavel

Re:Parsování souboru csv
« Odpověď #28 kdy: 20. 02. 2013, 03:58:47 »
Proto jsem ještě CRLF v CSVčku nikde neviděl.  ::)

Veci ktore som v zivote nevidel je vela, ale na nestastie medzi ne nepatri uvedena zalezitost.

Problem s CSV je v tom, ze narod ho pouziva nie ako format s nejakym RFC ale ako "to jednoduche cosi, co so vysypem z databazy a oddelim vybranym znakom" (vid toto vlakno).

CSV je velmi jednoduchý formát, a pokud dostačuje, není IMO důvod použít složitější.

CSV je format ku ktoremu musite mat doplnujuce informacie o tom, ako su pouzivane zakladne typy ako datum a cisla, ci ake je pouzite kodovanie.
Je prudko praktickejsie pouzit format, ktory nepotrebuje samostatny manual k jeho citaniu.

PanKapitanRUM

Re:Parsování souboru csv
« Odpověď #29 kdy: 20. 02. 2013, 09:25:19 »
Veci ktore som v zivote nevidel je vela, ale na nestastie medzi ne nepatri uvedena zalezitost.
Problem s CSV je v tom, ze narod ho pouziva nie ako format s nejakym RFC ale ako "to jednoduche cosi, co so vysypem z databazy a oddelim vybranym znakom" (vid toto vlakno).

Co ti na to mám říct?
Já těch věcí v životě viděl hodně, hlavně eshopů a CSVček, ale CRLF jako oddělovač okolo mě za 20 let vážně nikdy nešel.
Ale budu si pamatovat, že existují lidé jako ty, kteří by to tak byli schopní udělat ::) a že tedy musím příště věci dělat víc blbůmvzdorné  ::)
Sám sis o to řekl  ::)