Toen ik mijn wijnkast als tekstbestand had, kwam er een vraag terug die het bestand zelf niet beantwoordt: wat gaat er als eerste over? Je kunt hem elke keer aan een model stellen, en dan krijg je elke keer een net iets ander antwoord. Voor iets dat je wekelijks wilt weten is dat de verkeerde vorm.
Een script geeft elke keer hetzelfde antwoord. En als het antwoord fout is, is het reproduceerbaar fout, wat een stuk makkelijker repareert.
De klus
Een bestand met flessen erin, en een commando dat zegt welke er nu open moet. Draait op mijn eigen machine, stuurt niets weg, en werkt op een lijst die ik met de hand bijhoud.
Het lastige aan zo’n script is niet het rekenen. Het is dat een kelderlijst rommelig is. Namen met een komma erin, champagne zonder jaargang, een fles waarvan je het jaar nooit hebt ingevuld.
Mijn echte prompt
Schrijf een Node-script dat een CSV met mijn kelder leest en sorteert op
wat als eerste open moet.
Kolommen: naam, jaar, stijl, aantal. Namen kunnen een komma bevatten.
Gebruik een gesloten lijst met stijlen en een vast drinkvenster per stijl.
Herken geen druivenrassen en gok niet op de naam.
Bij een lege of onmogelijke waarde: sla de regel over, zeg welke regel het is
en waarom, en eindig met een foutcode. Verzin nooit een jaar.
Champagne zonder jaargang: reken vanaf het aankoopjaar en zeg erbij dat je
die aanname doet.
Het volledige script staat op sparkone.nl/tools/drinkvenster.mjs, met een voorbeeldbestand erbij. Draaien gaat zo:
node drinkvenster.mjs kelder.csv
En dan komt er dit uit:
TE LAAT 2022-2023 3x Provence rose
nu open 2024-2026 6x Muscadet Sevre et Maine
op dreef 2020-2031 2x Barolo Serralunga
Niet meegerekend:
regel 8: Rioja Gran Reserva — onbekende stijl "rood zwaar"
regel 11: Vergeten fles — jaar "" is leeg of onmogelijk
Ontleed
Drie instructies dragen dit script, en ze zijn overdraagbaar naar elk klusje waarin je eigen rommelige data zit.
Een gesloten lijst in plaats van herkenning. Het model wilde eerst druivenrassen uit de naam halen en daar een venster bij zoeken. Dat werkt indrukwekkend op de eerste tien flessen en stilletjes fout op de elfde. Acht stijlen die jij zelf invult zijn saaier en ze kloppen.
Luid falen boven doorrekenen. Een lege cel is geen nul. Standaard vult software zoiets aan, en bij een kelder betekent dat een fles die netjes in de lijst staat met een verzonnen jaar erachter. De instructie is dus expliciet: sla over, noem de regel, geef een foutcode.
Aannames zichtbaar maken. Champagne zonder jaargang moet ergens vanaf gerekend worden. Dat mag, zolang er achter de regel staat dat het een aanname is. Zodra aannames onzichtbaar worden, lijkt een schatting op een meting.
Wat brak
Bij het testen liep ik tegen drie dingen aan.
De eerste regel in mijn eigen bestand is “Domaine des Roches, Chenin”. Een script dat op komma’s splitst haalt daar twee kolommen uit en schuift alles op. Het model had dat opgelost door de naam achteraan te zetten, wat werkt tot iemand de kolommen ooit verplaatst. Het is uiteindelijk een kleine parser geworden die quotes respecteert, vijftien regels, en daarna maakt de volgorde niet meer uit.
De tweede: mijn eigen lijst gebruikte “rood zwaar”, het script kende alleen “rood stevig”. Dat viel eruit met een foutregel, precies zoals bedoeld. Toch was mijn eerste reflex om de lijst maar uit te breiden. Dat is de verkeerde reflex, want dan groeit hij bij elke fles verder tot herkennen tóch weer raden wordt. Ik heb mijn CSV aangepast.
De derde is inhoudelijk. Mijn rosé uit 2021 kreeg het label TE LAAT, en die drink ik gewoon nog. Het venster van twee jaar is streng. Dat is geen bug in de code maar een keuze in de tabel, en dat verschil is het hele punt van deze aanpak: je kunt precies aanwijzen wáár het oordeel zit, en het is één regel om het te veranderen.
Kanttekening
De vensters in dit script komen uit ervaring en vuistregels, niet uit onderzoek. Ze staan bewust bovenaan het bestand, zodat je ziet dat het een mening is en geen natuurkunde. Een model dat je hetzelfde antwoord in een zin geeft, verstopt diezelfde mening in vloeiend Nederlands.
Verder blijft alles hier op je eigen machine, en dat is een groter verschil dan het lijkt. Een voorraadlijst zegt wat er bij je thuis staat en ongeveer wat het waard is. Dat is precies het soort bestand dat je niet in een chatvenster plakt van een dienst waarvan je de bewaartermijn niet kent.
En de eerlijke kanttekening bij het genre: dit script is negentig regels omdat mijn kelder klein is. Als je twaalf flessen hebt, doet een tekstbestand hetzelfde en is dit tijdverdrijf.
Pak ‘t zelf
Begin met vijf regels in een CSV en draai het script. Als de uitvoer je verrast, klopt je lijst niet of klopt de tabel niet, en allebei is nuttig om te weten.
De lege prompt voor je eigen onderwerp:
Schrijf een script dat [mijn bestand] leest en sorteert op [wat het meest
dringend is].
Gebruik een gesloten lijst met [categorieën] en een vaste [regel] per categorie.
Herken niets uit vrije tekst en gok niet.
Bij een lege of onmogelijke waarde: sla de regel over, zeg welke regel het is
en waarom, en eindig met een foutcode.
Waar je een aanname doet, zet die aanname in de uitvoer.
Kleine oefening: pak een lijst die je al bijhoudt, zoek de rommeligste regel, en kijk wat er gebeurt als je die als eerste testrij gebruikt in plaats van als laatste.
