Každé ráno se stáhne nový export a z něj se přepočítá přehled pro poradu. Automatizace proběhne bez chyby, soubor má příponu CSV a dashboard se obnoví. Přesto v něm mohou být včerejší údaje, prázdná tabulka nebo přihlašovací stránka, kterou server poslal místo exportu.

Samotné stažení proto není hotový krok. Je to teprve převzetí zásilky. Než data pustíme do reportingu nebo další automatizace, potřebujeme ověřit, že přišel správný soubor, má očekávanou strukturu a popisuje období, které skutečně potřebujeme.

Nejde přitom jen o CSV. Stejný princip se hodí pro přílohy z e-mailu, soubory z úložiště i pravidelné exporty z aplikací: nový vstup nejdřív převezmeme bokem, zkontrolujeme a teprve potom jím nahradíme poslední známou dobrou verzi.

Nejdřív si domluvte, co přesně přebíráte

„Stáhneme CSV“ není úplné zadání. Potřebujeme vědět, odkud soubor přichází, kdy má být připravený a co znamená jeden řádek. Důležité je také období: obsahuje export celý dosavadní rok, poslední uzavřený den, nebo jen změny od minulého stažení?

Sepište si malou smlouvu o vstupu. Nemusí to být právní ani dlouhý dokument. Stačí, když odpoví alespoň na tyto otázky:

Právě poslední dvě otázky často rozhodují o tom, zda kontrola pomůže, nebo začne hlásit falešné chyby. Nulový počet řádků může být problém u seznamu otevřených zakázek, ale zcela platný výsledek u přehledu dnešních reklamací. Technická kontrola musí vycházet z významu dat.

Nový soubor nejdřív uložte bokem

Export nestahujte rovnou přes soubor, ze kterého čte reporting. Kdyby se přenos přerušil v polovině, další krok může začít pracovat s neúplným obsahem. Novou verzi proto uložte pod dočasným názvem a spolu s ní zaznamenejte čas stažení, zdrojovou adresu, výsledný stav požadavku a velikost souboru.

Hodí se uchovat i identifikátor verze, pokud ho zdroj poskytuje, nebo otisk obsahu. Díky němu poznáte, zda jste dostali stejný soubor podruhé. Nejde o důkaz, že data jsou správná. Je to ale spolehlivá informace, že se jejich obsah nezměnil.

Teprve dočasná kopie se předá kontrolám. Poslední dobrý export zůstává během celého kroku nedotčený a může dál sloužit čtenářům přehledu.

Kontrolujte přenos, strukturu i význam

Dobrá kontrola má několik vrstev. Každá odpovídá na jinou otázku a pomáhá přesněji určit, co se pokazilo.

Dostal se k nám očekávaný typ obsahu?

Úspěšná HTTP odpověď znamená, že server požadavek obsloužil. Sama neříká, že uvnitř je použitelný export. Ověřte proto konečnou adresu po případných přesměrováních, typ obsahu, nenulovou velikost a začátek souboru. HTML s přihlašovacím formulářem nechcete omylem zpracovat jako data.

Typ text/csv je užitečný signál, ale ne každá služba ho posílá správně. Kontrola se proto nemá spoléhat jen na jednu hlavičku. Potřebuje zároveň zkusit obsah bezpečně přečíst očekávaným CSV parserem.

Jde soubor jednoznačně přečíst?

CSV není jen text rozdělený na řádky a čárky. Hodnota může obsahovat čárku, uvozovky i nový řádek. Ve správně zapsaném souboru se takové hodnoty uzavírají do uvozovek a vnitřní uvozovky se zdvojují. Ruční dělení textu podle čárek proto dříve nebo později rozbije platný záznam.

Parser by měl znát očekávané kódování, oddělovač a přítomnost hlavičky. Potom zkontrolujeme povinné názvy sloupců, stejný počet polí v řádcích a to, že se sloupce neopakují. Pokud zdroj používá středník nebo jiné pořadí sloupců, musí to být vědomá součást dohody, ne odhad podle jednoho vzorku.

Dávají hodnoty smysl pro tento export?

Strukturálně platný soubor může být stále věcně špatně. Datum může ležet mimo očekávané období, identifikátor může chybět a částka může být text, který nejde bezpečně převést na číslo. U každého povinného pole proto určete jednoduché pravidlo: typ, povolenou prázdnost a případně rozsah nebo seznam hodnot.

Ověřte také jedinečnost záznamů. Když má každý řádek představovat jednu objednávku, neměl by se stejný identifikátor objevit dvakrát bez domluveného významu. Pokud export obsahuje více řádků k jedné objednávce, třeba po položkách, musí být jednoznačný až jejich společný klíč.

Je export aktuální a úplný?

Název souboru s dnešním datem ještě nedokazuje, že uvnitř jsou dnešní údaje. Porovnejte nejnovější očekávané datum v datech, čas vytvoření exportu, pokud je dostupný, a období, které má soubor pokrývat.

Počet řádků lze srovnat s předchozími běhy, ale opatrně. Náhlý pokles může odhalit neúplný export, stejně tak ale může být správným odrazem provozu. Proto je někdy vhodnější výraznou změnu poslat ke kontrole než kvůli ní celý běh automaticky zastavit.

Kontrola nemá dokazovat, že data jsou dokonale pravdivá. Má zastavit soubor, který porušuje předem domluvené podmínky.

Platnou verzi předejte jako jeden dokončený krok

Když nový export projde, přesuňte ho do místa, odkud ho čte další zpracování. Udělejte to tak, aby okolní systém viděl buď celou předchozí verzi, nebo celou novou verzi — nikdy soubor právě přepisovaný uprostřed.

Spolu s daty uložte krátký záznam o kontrole: kterou verzi jste převzali, kdy, kolik měla řádků a jaká pravidla prošla. Poslední dobrou verzi nemažte hned. Když se problém ukáže až později, potřebujete vědět, z čeho reporting počítal, a mít možnost se bezpečně vrátit.

Další kroky by měly začít až po tomto předání. Pokud se kontrola nepodaří, nový soubor zůstane stranou a reporting může dál ukazovat poslední ověřená data spolu s jasnou informací, k jakému okamžiku platí.

Opakování běhu nesmí vyrábět duplicity

Výpadek sítě má smysl po chvíli zkusit znovu. Chybějící sloupec se ale deseti opakováními neopraví. Rozlišujte proto dočasnou chybu přenosu od změny datového formátu nebo přístupu. První může automatizace opakovat s prodlevou, druhou má předat člověku, který umí dohodu se zdrojem vyřešit.

Každý běh by měl být opakovatelný. Když stáhnete stejnou verzi podruhé, nesmí vzniknout druhá sada stejných záznamů. Systém může shodu poznat podle identifikátoru exportu, otisku souboru nebo kombinace období a zdroje. Důležité je, aby byl způsob předem určený a dohledatelný.

Upozornění musí říkat, co má člověk udělat

Zpráva „import selhal“ pouze přesune hledání problému na příjemce. Užitečné upozornění uvede zdroj a očekávané období, konkrétní neúspěšnou kontrolu, pozorovanou hodnotu, čas poslední dobré verze a člověka nebo tým, který může rozhodnout o dalším kroku.

Běžné úspěchy mohou zůstat v historii běhů. Upozornění patří hlavně k situacím, kdy se automatizace sama bezpečně neposune dál. Jinak si lidé na každodenní zelené i červené zprávy zvyknou a přehlédnou tu, která opravdu vyžaduje zásah.

Kdy tento postup nestačí

Kontrolované převzetí je vhodné pro dávkové exporty, které se mění po hodinách nebo dnech. Není to náhrada za živé integrační rozhraní, pokud firma potřebuje změny během sekund nebo potvrzení každé jednotlivé operace.

Ani nejlepší validace neopraví nejasný význam dat. Pokud dva týmy chápou „dokončenou zakázku“ jinak, musí se nejdřív dohodnout na definici. U citlivých údajů je navíc potřeba samostatně vyřešit přístupy, šifrování, dobu uchování a audit. CSV pipeline tyto bezpečnostní a právní povinnosti sama nepokrývá.

Kontrolní otázky před spuštěním

  1. Víme, co představuje jeden řádek a jaké období export pokrývá?
  2. Dokážeme odlišit správné CSV od prázdné odpovědi nebo HTML stránky?
  3. Kontrolujeme povinné sloupce, typy hodnot a jedinečnost záznamů?
  4. Zůstane při chybě dostupná poslední známá dobrá verze?
  5. Je opakované spuštění bezpečné a bez duplicit?
  6. Dostane upozornění člověk, který může rozhodnout, co dál?
  7. Umíme dohledat, ze které verze vznikl konkrétní report?

Pokud na některou otázku odpověď chybí, začněte právě u ní. Spolehlivý reporting nevzniká až v grafu. Začíná ve chvíli, kdy dokážeme nový vstup bezpečně převzít a víme, proč mu dovolujeme pokračovat dál.

Formát CSV a práci s uvozovkami popisuje RFC 4180. Doporučení pro typ obsahu, kódování a strukturu tabulkových dat shrnuje W3C Model for Tabular Data and Metadata on the Web. Význam HTTP odpovědi a hlavičky Content-Type vymezuje RFC 9110.

Pokud teprve hledáte, který krok práce má smysl převzít, pokračujte článkem Neautomatizujte chaos. Nebo se podívejte na typy digitálních projektů, které v Duha Works řešíme.