Kennisbank
CSV- en Excel-bestanden van leveranciers: twaalf dingen die misgaan
Een leveranciersbestand gaat op drie niveaus mis: wat er in een cel staat, waar de kolommen staan en of het bestand van vandaag compleet is aangekomen. De twaalf fouten hieronder zijn elk met een vaste regel op te vangen, zolang de koppeling het bestand controleert voordat hij iets naar de webshop schrijft.
Bijgewerkt op
Wat gaat er mis, in één overzicht?
CSV heeft geen bindende standaard. RFC 4180 beschrijft het formaat met een komma als scheidingsteken en zegt er zelf bij dat het geen internetstandaard vastlegt. Elke leverancier exporteert dus wat zijn systeem of zijn Excel toevallig oplevert. Dit bestand bevat de eerste zes van de twaalf fouten:
Groothandel Jansen B.V.;;;;
Prijslijst en voorraad per 02-10-2026;;;;
;;;;
Artikelnr;Omschrijving;EAN;Voorraad;Netto prijs
00123456;Koppelstuk 22 mm, messing;8712345678906;1.234;12,50
00123457;Afdichtring 1/2";8712345678913;> 10;0,85
123458;Café-set 250 g;8,71235E+12;op voorraad;1.249,50
| Nr. | Wat er misgaat | Gevolg zonder controle |
|---|---|---|
| 1 | Puntkomma als scheidingsteken | Elke regel wordt één kolom |
| 2 | Decimale komma en punt voor duizendtallen | 1.234 stuks wordt 1,234 |
| 3 | Aantal als tekst: > 10, op voorraad |
Voorraad 0 of een afgekeurde regel |
| 4 | Windows-1252 in plaats van UTF-8 | Café in de producttitel |
| 5 | Voorloopnullen en EAN's na Excel | Artikel 123458 matcht niets |
| 6 | Kopregels met bedrijfsnaam en datum | Kolomnamen worden niet gevonden |
| 7 | Hernoemde of verschoven kolom | Prijs in het voorraadveld |
| 8 | Tabbladen in een andere volgorde | Prijslijst gelezen als voorraad |
| 9 | Tekst met vaste breedte | Alle velden schuiven op |
| 10 | Half geschreven bestand | Een deel van het assortiment op nul |
| 11 | Het bestand van gisteren | Verouderde voorraad, geen foutmelding |
| 12 | Ontbrekend artikel | Nul of onbekend, afhankelijk van toeval |
Wanneer een bestand de juiste keuze is en wanneer een API, staat in API of feed.
Tekens en getallen: wat staat er in een cel?
1. Puntkomma in plaats van komma
Excel neemt het scheidingsteken voor CSV uit de regio-instellingen van Windows. Met Nederlandse instellingen is de komma het decimaalteken en wordt het scheidingsteken een puntkomma. Een parser die een komma verwacht, leest de regel 00123456;Koppelstuk 22 mm, messing;... als twee velden, gesplitst na "22 mm". De koppeling stelt het scheidingsteken vast op de kopregel en legt het per leverancier vast.
Aanhalingstekens zijn het tweede struikelblok. Volgens RFC 4180 staat een veld met een scheidingsteken of aanhalingsteken tussen dubbele aanhalingstekens, en wordt een aanhalingsteken in het veld verdubbeld. In Afdichtring 1/2" staat een los inch-teken. Een strikte parser leest vanaf dat teken door tot het volgende aanhalingsteken, soms drie regels verder.
2. Decimale komma en punt voor duizendtallen
12,50 is twaalf euro vijftig. 1.234 in de kolom Voorraad is 1.234 stuks, en een parser die de punt als decimaalteken leest maakt er 1,234 van, afgerond 1. In 1.249,50 staan beide tekens. De regel per kolom: punt weg, komma wordt punt. Hoe bedragen daarna tussen systemen verschuiven staat in komma's, centen en btw.
3. Aantallen als tekst
Leveranciers die hun exacte voorraad niet prijsgeven, schrijven > 10, 10+, op voorraad of ja. Dat zijn geen getallen. Per leverancier ligt vast wat elke waarde betekent: > 10 telt als 10, op voorraad als een vast aantal of als onbekend. Een waarde die niet in die lijst staat, zoals binnenkort, keurt de regel af en zet hem op de controlelijst.
4. Windows-1252 in plaats van UTF-8
De é is in Windows-1252 één byte (E9) en in UTF-8 twee (C3 A9). Een UTF-8-bestand dat als Windows-1252 wordt gelezen, toont die twee bytes als é. Andersom is E9 geen geldige UTF-8 en verschijnt er een vraagteken in een ruit. Het euroteken is in Windows-1252 byte 80 en in UTF-8 drie bytes. De achtergrond staat in tekencodering en UTF-8.
5. Voorloopnullen en EAN's na een rondje Excel
Iemand bij de leverancier opent de export in Excel om hem te controleren en slaat hem op. Microsoft beschrijft wat er dan gebeurt: Excel verwijdert voorloopnullen en zet grote getallen om naar wetenschappelijke notatie. 00123458 wordt 123458. De EAN 8712345678920 wordt 8,71235E+12, en wie dat terugrekent krijgt 8712350000000: de laatste 7 cijfers zijn weg. Boven de 15 cijfers vervangt Excel de rest door nullen.
Voorloopnullen zijn te herstellen als de leverancier een vaste lengte gebruikt: aanvullen tot 8 posities. Een afgeronde EAN is niet te herstellen. Welke sleutel je voor het matchen kiest staat in SKU of EAN.
Kolommen, kopregels en tabbladen: waar staat wat?
6. Kopregels met bedrijfsnaam en datum
De kolomnamen staan in het voorbeeld op regel 4, na een bedrijfsnaam, een datum en een lege regel. Een koppeling die "sla 3 regels over" als regel heeft, breekt zodra de leverancier een vierde regel toevoegt. De koppeling zoekt daarom de eerste regel waarin de verwachte kolomnamen staan.
7. Een hernoemde of verschoven kolom
Netto prijs wordt Nettoprijs excl. BTW, of er komt een kolom Merk tussen. Wie op positie leest (kolom 5 is de prijs) zet na die wijziging de voorraad in het prijsveld. Wie op naam leest, mist de hernoemde kolom. In beide gevallen hoort de run te stoppen: ontbreekt een verwachte kolom, dan wordt er niets geschreven.
8. Tabbladen in een andere volgorde
Een xlsx-bestand met de tabbladen Voorraad en Prijslijst wordt vaak gelezen als "het eerste tabblad". Sleept iemand de prijslijst naar voren, dan leest de koppeling prijzen als voorraad: een artikel van € 85,00 heeft dan 85 stuks. De koppeling kiest het tabblad op naam. Slaat de leverancier op als CSV, dan bewaart Excel alleen het actieve tabblad, en dat is het blad dat toevallig open stond.
Datums in Excel zijn volgnummers. Een verwachte leverdatum van 14 oktober 2026 staat in de cel als 46309. Wordt de cel zonder opmaak gelezen, dan komt dat getal in het veld voor de levertijd terecht.
9. Tekst met vaste breedte
Oudere groothandelssystemen leveren regels zonder scheidingsteken, met vaste posities:
00123456KOPPELSTUK 22 MM MESSING 0001234000001250
00123457AFDICHTRING 1/2 INCH 0000010000000085
Positie 1 tot 8 is het artikelnummer, 9 tot 38 de omschrijving, 39 tot 45 de voorraad en 46 tot 54 de prijs in centen. Verbreedt de leverancier de omschrijving van 30 naar 35 tekens, dan leest de oude indeling voor de eerste regel voorraad 0 en prijs 012340000: € 123.400,00. De koppeling controleert daarom de regellengte, hier 54 tekens, voordat hij een bestand verwerkt.
Aflevering: is dit het bestand van vandaag, en is het compleet?
10. Een half geschreven bestand
De export van de leverancier start om 06:00 en doet 40 seconden over het schrijven. De koppeling haalt het bestand om 06:00:20 op en krijgt de eerste helft. Het bestand is geldig CSV, alleen korter.
Het rekenvoorbeeld: gisteren 4.200 regels, vandaag 2.650. Er ontbreken 4.200 min 2.650 is 1.550 regels, en 1.550 gedeeld door 4.200 is 36,9%. Met de regel "stop als het aantal regels meer dan 10% afwijkt van de vorige run" ligt de grens bij 420 regels. De run stopt en de webshop houdt de stand van gisteren. Zonder die regel, en met "ontbreekt is nul", gaan 1.550 artikelen op niet leverbaar.
Twee extra controles: de laatste regel moet evenveel velden hebben als de kopregel, en de bestandsgrootte moet bij twee metingen achter elkaar gelijk zijn. Een leverancier die meewerkt schrijft naar voorraad.csv.tmp en hernoemt het bestand als het klaar is.
11. Het bestand van gisteren
De export bij de leverancier draait een nacht niet. Op de SFTP-server staat voorraad.csv nog, met de inhoud van gisteren. De koppeling leest het, vindt geen fouten en schrijft dezelfde voorraad opnieuw. Niemand krijgt een melding.
De koppeling bewaart van elk verwerkt bestand de wijzigingsdatum en een controlesom. Is het bestand identiek aan het vorige, of ouder dan bijvoorbeeld 26 uur bij een dagelijkse export, dan gaat er een melding uit. Een bestandsnaam met datum (voorraad-20261002.csv) maakt dit zichtbaar zonder controlesom, en verwerkte bestanden gaan naar een archiefmap.
12. Een artikel dat ontbreekt: nul of onbekend
Artikel 00123456 stond gisteren in het bestand en vandaag niet. Dat kan drie dingen betekenen: uitverkocht, uit het assortiment, of niet in de export van vandaag. Bij een volledig bestand ligt per leverancier vast wat er gebeurt: voorraad op nul, voorraad ongewijzigd, of depubliceren na bijvoorbeeld drie runs zonder het artikel. Bij een bestand met alleen wijzigingen (een delta) betekent ontbreken: ongewijzigd. Wie een delta als volledig bestand behandelt, zet bij 4.200 artikelen en 60 gewijzigde regels 4.140 artikelen op nul.
Hoe controleer je een bestand voordat het de webshop raakt?
De twaalf punten komen neer op vier controles, in deze volgorde. Faalt er een, dan schrijft de koppeling niets.
| Controle | Wat wordt vergeleken | Vangt |
|---|---|---|
| Is het bestand nieuw? | Wijzigingsdatum en controlesom tegen de vorige run | 11 |
| Is het compleet? | Aantal regels tegen de vorige run, velden op de laatste regel | 10 |
| Klopt de indeling? | Scheidingsteken, codering, verwachte kolomnamen, tabblad op naam, regellengte | 1, 4, 6, 7, 8, 9 |
| Klopt elke regel? | Getalnotatie, toegestane tekstwaarden, lengte van artikelnummer en EAN | 2, 3, 5 |
Punt 12 is geen controle, het is een afspraak per leverancier. Regels die de laatste controle niet halen gaan naar de controlelijst. De rest van het bestand wordt verwerkt.
Wat betekent dit voor je koppeling?
Het inlezen van een leveranciersbestand is het kleine deel van het werk. De controles eromheen bepalen of de voorraad in je webshop klopt op de dag dat het bestand afwijkt. Wij bouwen de koppeling op de bestanden van jouw leveranciers, met per leverancier de indeling, de toegestane waarden en de regel voor ontbrekende artikelen. Daarna hosten en bewaken we hem, en passen we de mapping aan als een leverancier zijn export verandert.
Voordat de koppeling live gaat, draait hij in een dry run: je ziet per run welke artikelen zouden wijzigen, van welke waarde naar welke. Afgekeurde regels en gestopte runs staan in het dashboard met de reden erbij. Hoe dat voor voorraad en levertijd van leveranciers werkt, staat op leveranciersvoorraad koppelen aan je webshop. Vertel van welke leveranciers je bestanden krijgt en in welke vorm, dan hoor je welke van de twaalf punten daarin spelen.
Veelgestelde vragen
Waarom staan er vreemde tekens zoals é in mijn productnamen?
Het bestand is opgeslagen als UTF-8 en ingelezen als Windows-1252, of andersom. In UTF-8 is de é twee bytes (C3 A9); gelezen als Windows-1252 worden dat de twee tekens à en ©. De koppeling stelt de codering per leverancier vast en zet alles om naar UTF-8 voordat de tekst de webshop bereikt.
Hoe voorkom ik dat Excel de voorloopnullen uit artikelnummers haalt?
Door het CSV-bestand niet te openen met dubbelklikken. Excel verwijdert voorloopnullen en zet lange getallen om naar wetenschappelijke notatie zodra het een kolom als getal herkent. Importeer het bestand via Gegevens ophalen en zet de kolom op Tekst. Een koppeling die het bestand rechtstreeks van de leverancier ophaalt, heeft dit probleem niet: er zit geen Excel tussen.
Mijn leverancier levert alleen een Excel-bestand. Kan daar een koppeling op draaien?
Ja. Een xlsx-bestand is in te lezen zonder Excel. De koppeling kiest het tabblad op naam, zoekt de kopregel op inhoud en leest datums als datum in plaats van als volgnummer. Het bestand komt per e-mail, via SFTP of van een downloadlink; welke route het wordt staat in koppelen zonder API.
Wat gebeurt er als een artikel niet meer in het bestand staat?
Dat hangt af van de regel die voor deze leverancier is vastgelegd. Bij een volledig bestand kan een ontbrekend artikel op nul gaan, onbekend blijven of na een aantal runs worden gedepubliceerd. Bij een bestand met alleen wijzigingen betekent ontbreken dat er niets veranderd is. Zonder vastgelegde regel kiest de software, en dat is meestal nul.
Wat als de leverancier de indeling van het bestand verandert?
De koppeling herkent kolommen op naam en controleert bij elke run of alle verwachte kolommen aanwezig zijn. Ontbreekt er een, dan stopt de run voordat er iets naar de webshop gaat en krijg je een melding met de naam van de kolom. De mapping wordt aangepast en de run draait opnieuw op hetzelfde bestand.
Vertel wat je nodig hebt
Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.
- Je weet de prijs en de doorlooptijd voordat je iets toezegt
- Wij zoeken uit welke koppeling het werk uit handen neemt
- Wij verzorgen de bouw, hosting, bewaking en het onderhoud
- Je team krijgt minder overtypwerk en minder uitzoekwerk