CSV s pevnou délkou řetězce   otázka

C#, VB.NET, Algoritmy, I/O operace

Zdravím,

řeším teď problém ve Visual Basicu ohledně zápisu do SCV souboru s pevnou délkou znaků.

Zápis a všechno ostatní není problém. Nemůžu ale vymyslet nějaké elegantní postup, jak zapisovat do souboru (klasický texťák) na konkrétní místa.

Mám popis cca 200 vstupních proměnných (budou se brát z nějakého datatablu) a každá má definováno jakou má délku a v kterém místě se nachází. Potřeboval vymyslet funkci, která by pak byla něco ve smyslu:

writeCsv(7,1,id) -> délka, začátek pozice, proměnná

writeCsv(42,255,jmeno)

Problém je v tom, že z těch proměnných využiji tak polovinu maximálně. A jelikož při zápisu do souboru, nejde (pokud vím) skákat na konkrétní místa, nevím přesně jak to řešit. Potřebuju zapsat na začátek a pak třeba až na 255 znak.

Přemýšlel jsem o zápisu do nějakého mema a terpve pak toto zapsat do souboru. Nevím ale jak to přežije, jelikož soubor může být dost velký. Nebo budu muset vypisovat všechny proměnné, i když budou prázné. Pak by se mi lehce mohlo stát, že se přepočítám a uskočí mi to o znak, jelikož při zápisu se dá definovat jen zapsaný text, ale ne odkud má psát. Tak teď nevím

Za každou radu budu rád, díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zapisovat do souboru na libovolné místo samozřejmě lze, to je naprosto základní funkčnost. Pokud mají mít hodnoty sloupců pevnou šířku, šlo by použít funkci String.Format, u které je možné definovat, na jakou délku se má řetězec zarovnat. Pokud je kratší, doplní se mezerami, pokud delší, ořízne se.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

a mohl bych se k tomu dozvědět něco více ? jako do prázdného souboru zapíšu například na 255. znak ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nebude se řešit na jakou pozici zapisovat do souboru, pouze výsledný formát:

Console.WriteLine(String.Format(CultureInfo.InvariantCulture, _
                                """{0,10}"",""{1:00000}""", _
                                "Ondřej", _
                                123))
'Formát bude "    Ondřej","00123"

Výše uvedený příklad zformátuje textový řetězec na první pozici tak, aby zabíral přesně 10 znaků a číslo na druhé pozici aby zabíralo 5 znaků.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Bohužel to, kolik znaků bude ten řetězec mít, to mám vymyšlené (mám na to funkci). Já nemám první a druhou pozici, ale jen informaci na kolikátém znaku bude začínat ten zápis. A jelikož těch definic je přes 200, musel bych definovat délku všech dvou set řetězců co tam budu zapisovat.

Takže se zeptám takto, nejde zapsat do souboru na konkrétní znak v případě že nevím kde skončil poslední zápis ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

CSV je text oddělený čárkami buď s pevnou šířkou sloupců, nebo s šířkou závislou na obsahu sloupců, volitelně s úvozovkami na začátku a konci každého sloupce. Cokoliv jiného není CSV.

Pokud máte informaci o tom, kde začíná konkrétní sloupec, máte zároveň informaci o tom, jak je který sloupec dlouhý a v tom případě není problém použít moje řešení. Skákat na různá místa v souboru pomocí SetPosition u streamu je hovadina, navíc se tam bude plést CRLF pro ukončení řádku.

A jelikož těch definic je přes 200, musel bych definovat délku všech dvou set řetězců co tam budu zapisovat. vs. Problém je v tom, že z těch proměnných využiji tak polovinu maximálně. Tak co je platné tvrzení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě to nejspíš není CSV, jelikož dokonce i hlavička a tělo má jinou definici. Proto se možná jednoduchý problém zdá tak složitý. Každopádně tam vydefinuji asi každou proměnou, bude to tak jednodušší.

díky za rady

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A je nutné používazt formát CSV nebyl by na toto vhodnější například XML (navíc s XSLT transformací)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohužel CSV je nutností, klasické CSV není problém, jen nevím jak vyřešit tu pozici znaku v soboru

nahlásit spamnahlásit spam 0 odpovědětodpovědět

O jak velký soubor půjde a jak často se bude modifikovat? Jednodušší variantou by bylo vše načíst do paměti, změnit a znovu zapsat. Není to sice optimální řešení, na druhou stranu CSV není připraven pro tento druh zápisu a modifikace. Navíc takováto edice může způsobit mnohem častěji případné chyby, kdy si soubor rozhodíte.

Druhou možností je zajistit pevnou délku řádků a vytvořit si struktury, které budou popisovat pozice hodnot na řádku, jejich čtení a serializaci zpět. Tím možnost chyby výrazně omezíte (pokud tedy někdo nebude soubor měnit ručně, nebo ho nepřeformátuje jiná aplikace). Je to ale víc práce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A není CSV náhodou řádkový formát souboru ? Teda neexistuje pozice znaku v souboru, ale jenom pořadové číslo řádku a pozice znaku v řádku ?

A další otázka. Jak se bude zapisovat ? Sekvenčne, nebo na přeskáčku ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle mně se tady mluví o formátu SDF a ne CSV.

ZK

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback