Toimittajan hinnasto on aina sotkuisempi kuin luulet: parserit, jotka kestävät todellisuutta

Rakensin putken, joka vie toimittajien hinnastot verkkokaupan hinnoiksi asti. Tärkein oppi: speksaa parseri oikeaa aineistoa vasten ja validoi tulos omaa katalogia vasten.

Huomio nimistä: Tämä kirjoitus perustuu omaan, oikeaan työhöni. Toimittajan nimi Hopeakuu on keksitty, eikä oikeaa hinnastodataa jaeta. Opit ja menetelmät ovat aitoja ja sellaisenaan käyttökelpoisia.

Verkkokaupan hintojen päivitys toimittajan hinnastosta kuulostaa yksinkertaiselta: lue tiedosto, päivitä hinnat. Käytännössä toimittajien hinnastot ovat Excel-arkeologiaa – yhdistettyjä soluja, tuoteperheitä rivien yli, hiljaisia sarakemuutoksia ja ihmisille (ei koneille) kirjoitettuja rakenteita.

Rakensin putken, joka vie hinnaston tiedostosta verkkokaupan hinnoiksi asti. Tässä sen rakenne ja tärkeimmät opit.

Parseriarkkitehtuuri: rekisteri + geneerinen fallback

Jokainen toimittaja saa oman parserinsa, joka toteuttaa yhteisen rajapinnan: sisään tiedosto, ulos normalisoituja rivejä (SKU, nimi, hinta, kustannus, valuutta). Parserit elävät rekisterissä, josta oikea valitaan toimittajan mukaan.

Lisäksi putkessa on geneerinen CSV-fallback: siisti, standardimuotoinen aineisto menee läpi ilman räätälöityä parseria. Tämä kahtiajako kannattaa – räätälöinti vain sinne, missä todellisuus sitä vaatii.

Tärkein oppi: speksaa oikeaa aineistoa vasten

Ensimmäinen versioni Hopeakuu-toimittajan parserista syntyi oletusten pohjalta – kuvittelin, miltä hinnasto näyttää. Kun sain oikean tiedoston käteen, heitin speksin roskiin ja kirjoitin sen uusiksi todellista aineistoa vasten. Tämä uudelleensuunnittelu näkyy projektin historiassa omana committinaan, ja se oli koko putken arvokkain yksittäinen päätös.

Sääntö, jonka tästä otin käyttöön: parseria ei speksata ennen kuin oikea tiedosto on kädessä. Esimerkkiaineisto tai muistikuva rakenteesta ei riitä – parseri, joka toimii kuvitellulla datalla, on pahempi kuin ei parseria, koska se tuottaa vääriä rivejä itsevarmasti.

Katalogivalidoitu ryhmittely

Hinnastoissa tuotteet esiintyvät usein perheinä: päärivi ja sen alla variantteja, joiden yhteys näkyy vain asettelusta. Pelkkä rivikohtainen parsinta tuottaa tässä joko orpoja variantteja tai vääriä yhdistelmiä.

Ratkaisu oli katalogivalidoitu ryhmittely: parserin muodostamat tuoteryhmät tarkistetaan kaupan omaa katalogia vasten. Jos ryhmän SKU:t osuvat katalogissa saman tuotteen variantteihin, ryhmittely on oikein; jos SKU:t hajoavat eri tuotteisiin, rivi menee poikkeusjonoon ihmisen katsottavaksi. Oma katalogi on paras validointidata, joka sinulla jo on – käytä sitä.

Live-päivitys vasta suunnitelman kautta

Parsittu ja validoitu aineisto ei kirjoita hintoja suoraan. Putki tuottaa ensin muutossuunnitelman: mitkä hinnat muuttuisivat, mistä mihin, ja miksi. Vasta hyväksytty suunnitelma ajetaan kauppaan, ja ajosta jää snapshot, jolla muutokset voi tarvittaessa perua.

Tämä kolmivaihe – parsinta, suunnitelma, hyväksytty ajo – tuntuu hitaammalta kuin suora päivitys, mutta on ainoa malli, jolla uskallan ajaa hintamuutoksia tuhansiin tuotteisiin ilman valvottua yötä.

Muistilista hinnastoputken rakentajalle

  • Yksi parseri per toimittaja yhteisen rajapinnan takana; geneerinen fallback siisteille aineistoille
  • Älä speksaa parseria ennen kuin oikea tiedosto on kädessä
  • Validoi ryhmittely ja SKU:t omaa katalogia vasten; epävarmat rivit poikkeusjonoon, ei läpi
  • Tuota muutossuunnitelma, älä kirjoita suoraan – ja ota snapshot ennen ajoa
  • Kirjaa jokainen ajo: mitä aineistoa käytettiin, mitä muuttui, kuka hyväksyi

Hinnastojen parsinta ei ole glamoröösiä työtä, mutta se on täsmälleen sitä liimakoodia, jossa AI-avusteinen kehitys loistaa – kunhan rakenne pakottaa jokaisen oletuksen testatuksi oikeaa dataa vasten.