Naar de inhoud
maarten.
Alle stories

CSV- en Excel-imports: validatie en foutafhandeling

Maarten Soetens 13 min lezen

Een betrouwbare CSV- of Excel-import moet omgaan met afwijkende kolommen, verschillende tekencoderingen en rijen die niet aan de verwachte gegevensstructuur voldoen. Deze gids behandelt hoe je bestanden controleert, waarden valideert en fouten rapporteert zonder geldige gegevens onnodig te blokkeren.

Een import opdelen in herkenbare verwerkingsstappen

Een importproces wordt beter beheersbaar wanneer bestand inlezen, structureren, valideren en opslaan afzonderlijke stappen zijn. Begin met het veilig ontvangen van het bestand en controleer de bestandsgrootte, het formaat en de bestandsextensie. De extensie alleen is geen bewijs dat de inhoud klopt: een bestand met de naam .csv kan bijvoorbeeld een verkeerd gescheiden of zelfs binair bestand bevatten.

Daarna volgt het parsen: de ruwe inhoud wordt omgezet naar rijen en kolommen. In deze fase hoort de software nog geen bedrijfsregels toe te passen. De volgende stap koppelt kolommen aan velden in het datamodel, waarna technische en inhoudelijke validatie plaatsvinden. Pas als duidelijk is welke rijen bruikbaar zijn, bepaal je hoe gegevens worden opgeslagen. Door deze verantwoordelijkheden te scheiden, blijft een fout in het parsen te onderscheiden van een ongeldige datum of een duplicaat.

Leg per stap vast welke invoer en uitvoer wordt verwacht. Zo kun je bijvoorbeeld de herkende kolomnamen en het aantal gelezen rijen loggen, zonder persoonsgegevens in logs te kopiëren. Een pipeline maakt herverwerking ook eenvoudiger: wanneer de kolomherkenning verbetert, kan dezelfde testset opnieuw door die stap worden gehaald. Vermijd één functie die tegelijk bestanden decodeert, velden omzet, databasewijzigingen uitvoert en foutmeldingen samenstelt. Die aanpak lijkt aanvankelijk direct, maar maakt fouten lastig te lokaliseren en wijzigingen risicovol.

CSV-kolommen herkennen ondanks afwijkende kopregels

CSV-bestanden die uit verschillende systemen komen, gebruiken vaak andere namen voor hetzelfde veld. Een datum kan bijvoorbeeld als geboortedatum, birth_date of datum worden aangeleverd. Een import kan zulke varianten ondersteunen met een expliciete mapping van toegestane aliassen naar interne veldnamen. Normaliseer kopregels vooraf: verwijder overtollige spaties, maak hoofdlettergebruik consistent en behandel bekende verschillen in accenten of leestekens volgens vaste regels.

Automatische herkenning heeft grenzen. Een fuzzy match kan een nuttig voorstel opleveren, maar mag niet stilzwijgend twee vergelijkbare kolommen verwisselen. Een kolom met klantnummer is niet vanzelf hetzelfde als een extern referentienummer. Gebruik voor verplichte velden daarom een exacte mapping of vraag om bevestiging wanneer meerdere kandidaten overeenkomen. Controleer ook op dubbele kopregels na normalisatie. Twee kolommen die allebei als e-mailadres worden herkend, vragen om een expliciete fout in plaats van een willekeurige keuze.

Ontbrekende optionele kolommen kunnen een leeg veld opleveren, terwijl ontbrekende verplichte kolommen meestal reden zijn om het bestand niet te verwerken. Dat onderscheid hoort per importtype in de configuratie te staan. Laat in de foutmelding zien welke kolommen zijn gevonden en welke velden ontbreken, maar vermijd lange interne veldnamen als die voor de gebruiker niets betekenen. Bij imports die vaak terugkeren, is een opgeslagen kolommapping praktisch. Bewaar die wel gekoppeld aan het betreffende formaat of de bron, zodat een wijziging in een andere export niet ongemerkt een verkeerde interpretatie veroorzaakt.

Scheidingstekens en CSV-structuur correct parsen

Een CSV-bestand is niet altijd komma-gescheiden. In Nederland komen puntkomma’s vaak voor, onder meer doordat spreadsheets komma’s als decimaalteken gebruiken. Ook tabtekens, aanhalingstekens en regeleinden kunnen per programma verschillen. Kies daarom een parser die de CSV-specificatie en gequote velden aankan, in plaats van regels simpelweg op komma’s te splitsen. Een adres met een komma tussen aanhalingstekens moet één cel blijven; een eigen splitsroutine maakt daar anders meerdere kolommen van.

Automatische detectie van het scheidingsteken kan nuttig zijn, maar is geen foutloze waarheid. Een bestand met weinig rijen of veel tekstvelden kan de detectie misleiden. Beperk de kandidaattekens en controleer of meerdere voorbeeldregels na het parsen een vergelijkbaar aantal kolommen hebben. Als de uitkomst ambigu is, meld dat dan of laat de gebruiker een keuze maken. Stilzwijgend een verkeerde delimiter kiezen leidt vaak tot honderden misleidende validatiefouten, terwijl de kernfout in de bestandsstructuur zit.

Let ook op lege regels, regeleinden binnen gequote velden en een optionele byte order mark aan het begin van het bestand. Controleer per rij of het aantal velden past bij de kopregel. Een afwijkend aantal velden kan wijzen op een ontbrekend scheidingsteken, een niet-afgesloten quote of een beschadigde rij. Vermeld in de foutmelding het rijnummer en, waar mogelijk, het soort structurele afwijking. Het onderscheid tussen een parsefout en een ongeldige veldwaarde helpt zowel bij herstel van het bronbestand als bij het verbeteren van de importregels.

Tekencodering detecteren en tekst correct bewaren

Onleesbare accenten en vreemde tekens wijzen vaak op een mismatch tussen de encoding van het bestand en de manier waarop de import het leest. UTF-8 is een geschikte standaard voor nieuwe gegevens, maar bestaande exports kunnen bijvoorbeeld Windows-1252 of ISO-8859-1 gebruiken. Encodingdetectie op basis van een paar bytes is niet altijd betrouwbaar: meerdere encodings kunnen dezelfde reeks bytes anders interpreteren zonder een parsefout te geven. Vraag daarom waar mogelijk om UTF-8, herken een byte order mark en bied alleen onderbouwde alternatieven aan.

Een decoder moet fouten niet onzichtbaar vervangen door vervangtekens. Daardoor kan een naam of sleutelveld veranderen terwijl de import technisch succesvol lijkt. Stel waar passend strikte decoding in en rapporteer dat de tekencodering niet geldig is. Bij een ondersteunde fallback is het verstandig de gekozen encoding in het importverslag te vermelden. Zo kan een beheerder de herkomst van afwijkende tekens onderzoeken in plaats van te moeten raden of de data al in het bronbestand beschadigd was.

Normaliseer tekst alleen wanneer de toepassing daar een duidelijke reden voor heeft. Unicode kan visueel identieke tekens op verschillende manieren coderen; normalisatie is daarom relevant voor vergelijken en dedupliceren. Dat betekent niet dat alle tekst naar kleine letters moet of accenten verwijderd moeten worden. Zulke omzettingen veranderen gegevens en kunnen betekenis verliezen. Bewaar de oorspronkelijke waarde wanneer die nodig is voor controle, en gebruik een aparte genormaliseerde representatie voor zoek- of vergelijkingsregels. Test met accenten, niet-Latijnse schriften, emoji en tekens die in de gebruikte database speciale betekenis hebben.

Excel-bestanden verwerken zonder verborgen aannames

Excel-imports vragen andere keuzes dan CSV-imports. Een werkmap kan meerdere werkbladen bevatten, verborgen rijen hebben of boven de kopregel extra toelichting bevatten. Selecteer daarom niet blind het eerste werkblad en neem de eerste rij niet automatisch als header. Bepaal per importtype welk werkblad en welke kopregel worden verwacht, of toon een voorvertoning waarmee de gebruiker die keuze kan controleren. Vermeld ook wanneer een werkblad leeg is of de verwachte kolommen niet bevat.

Excel-cellen bevatten naast zichtbare tekst ook typen, formules en opmaak. Een datum kan als datumwaarde zijn opgeslagen, maar ook als tekst of als numerieke serienummerwaarde. De opmaak van een cel is niet altijd een betrouwbare aanwijzing voor de betekenis. Spreek daarom af welke typen worden ondersteund en converteer op basis van de waarde en de regels van het doelveld. Formules verdienen aparte aandacht: sommige bibliotheken lezen de formule, andere de laatst opgeslagen uitkomst, en die uitkomst kan ontbreken of verouderd zijn.

Ook lege cellen, samengevoegde cellen en voorloopnullen zorgen voor afwijkingen. Een accountcode die als getal is opgeslagen kan zijn nullen al verloren hebben voordat de import begint. Verander numerieke waarden dus niet automatisch in tekst met een gegokt aantal nullen. Meld wanneer het bronbestand de oorspronkelijke representatie niet meer bevat. Beperk daarnaast welke bestandstypen en werkbladfuncties worden geaccepteerd. Macro’s uitvoeren hoort niet bij het inlezen van een werkmap; lees alleen de waarden en metadata die het importproces nodig heeft.

Datavalidatie voor lege waarden en veldtypen

Na het parsen moet iedere waarde worden geïnterpreteerd volgens het doelveld. Een getal, datum, e-mailadres of statuscode heeft andere validatieregels dan vrije tekst. Maak die regels expliciet: leg vast welke velden verplicht zijn, welke waarden zijn toegestaan en of spaties aan het begin of einde worden verwijderd. Zonder vaste regels kunnen twee importpaden dezelfde invoer verschillend behandelen. Een lege tekst, een ontbrekende kolom en een cel met alleen spaties zijn bovendien niet noodzakelijk hetzelfde.

Null-waarden vragen bijzondere aandacht. Sommige exports gebruiken een lege cel, andere een vaste aanduiding zoals N/A of NULL. Behandel zulke tekst alleen als leeg wanneer dat voor het betreffende veld is afgesproken; in een beschrijvend tekstveld kan N/A juist echte inhoud zijn. Ook datumconversie moet een afgesproken formaat volgen. Waarden als 03/04/2025 zijn ambigu zonder kennis van dag- en maandvolgorde. Vertrouw niet uitsluitend op regionale instellingen van de server, want die kunnen tussen ontwikkel-, test- en productieomgevingen verschillen.

Valideer zowel de individuele waarde als de relatie tussen velden. Een einddatum vóór de startdatum kan bijvoorbeeld afzonderlijk een geldige datum zijn, maar samen ongeldig. Voer typeconversies gecontroleerd uit en behoud de oorspronkelijke invoer voor foutmeldingen. Zo kan een melding tonen dat de waarde 31-13-2025 niet als datum kan worden verwerkt, zonder een technisch exceptionbericht te tonen. Geef per fout aan welk veld geraakt is en welke regel niet is gehaald. Vermijd onnodig strenge regels die geldige bronvarianten afwijzen; versoepel ze echter niet zo ver dat onbruikbare of dubbelzinnige waarden stilzwijgend worden opgeslagen.

Ongeldige rijen melden zonder de hele import te blokkeren

Een import met één ongeldige rij hoeft niet altijd volledig te stoppen. De juiste keuze hangt af van de samenhang tussen rijen en de gevolgen van gedeeltelijke verwerking. Bij onafhankelijke contactrecords kan het praktisch zijn geldige rijen te verwerken en fouten per rij te verzamelen. Bij een bestand dat samen een financiële boeking of een andere ondeelbare transactie vormt, kan gedeeltelijke opslag juist een onjuiste toestand creëren. Bepaal dit vooraf per importsoort en communiceer duidelijk of verwerking volledig, gedeeltelijk of helemaal niet heeft plaatsgevonden.

Maak meldingen bruikbaar door ze te koppelen aan een rijnummer, veldnaam en begrijpelijke oorzaak. Een fout zoals ongeldige waarde helpt meer dan een stacktrace of een generieke import mislukt. Als het veilig kan, vermeld dan de aangeleverde waarde, maar beperk of maskeer gevoelige gegevens. Voeg ook een grens toe aan het aantal getoonde fouten. Bij een verkeerde encoding kunnen duizenden rijen falen; een compacte melding met het aantal fouten en enkele representatieve voorbeelden is dan beter dan een onbruikbaar scherm.

Voorkom dat een fout de rest van de verwerking onbedoeld verandert. Valideer eerst de volledige batch wanneer dat nodig is, of sla geldige rijen op met een transactie- en herhaalstrategie die dubbele verwerking voorkomt. Maak onderscheid tussen fouten die de gebruiker kan herstellen en fouten die wijzen op een systeemprobleem. Een ongeldige datum vraagt om een aangepaste rij; een databaseverbinding die wegvalt vraagt om controle van de verwerking zelf. Bewaar genoeg context voor onderzoek, maar toon interne details alleen aan bevoegde beheerders.

Importresultaten herleidbaar maken met logging en tests

Een import is pas goed te beheren wanneer achteraf zichtbaar is wat er met een bestand is gebeurd. Registreer per uitvoering een uniek identificatienummer, het bestandstype, de gekozen encoding, het aantal gelezen rijen en de aantallen geaccepteerde en afgewezen rijen. Leg ook vast welke versie van de importregels is gebruikt. Dat maakt resultaten vergelijkbaar wanneer een mapping of validatieregel later verandert. Sla niet standaard volledige bestanden of alle celwaarden in logs op: die kunnen persoonsgegevens of vertrouwelijke bedrijfsinformatie bevatten.

Test parsergedrag met representatieve bestanden en doelbewust afwijkende voorbeelden. Neem verschillende delimiters, gequote regeleinden, een byte order mark, afwijkende encodings, ontbrekende kolommen, dubbele headers en lege waarden op. Test niet alleen of de parser een fout geeft, maar ook of de melding de juiste rij en oorzaak aanwijst. Voor Excel zijn extra gevallen nodig, zoals meerdere werkbladen, formules, gemengde celtypen en ontbrekende opgeslagen formule-uitkomsten. Een kleine vaste testset beschermt tegen regressies wanneer bibliotheken of importregels veranderen.

Voor grotere importstromen is een voorvertoning waardevol: toon een beperkt aantal geparste rijen en de voorgestelde veldkoppelingen voordat gegevens worden opgeslagen. Dat is geen vervanging voor validatie, maar maakt verkeerde aannames eerder zichtbaar. Test daarnaast herhaald verwerken van hetzelfde bestand. Als een gebruiker na een time-out opnieuw uploadt, moet het systeem kunnen voorkomen dat records dubbel worden aangemaakt of helder melden dat een batch al is verwerkt. Koppel zulke controles aan een import-ID of betrouwbare sleutel, niet uitsluitend aan de bestandsnaam.

Veelgestelde vragen

Hoe voorkom ik dat dezelfde CSV-import per ongeluk twee keer wordt verwerkt?

Voorkom dubbele verwerking door iedere import een unieke sleutel te geven en herhaalde verzoeken met dezelfde sleutel veilig af te handelen. Een gebruiker kan bijvoorbeeld opnieuw op importeren klikken of een wachtrij kan een taak opnieuw aanbieden nadat een verbinding is weggevallen. Zonder bescherming kan dezelfde rij dan meer dan één keer worden opgeslagen.

  • Geef elke importopdracht een unieke identificatie en controleer of die al is verwerkt.
  • Gebruik waar mogelijk een stabiele sleutel per record, zoals een extern klantnummer, met een passende unieke databasebeperking.
  • Leg vast of een herhaalde import bestaande gegevens moet bijwerken, overslaan of als conflict melden.

Hoe test ik een CSV- of Excel-import voordat die in productie gaat?

Test een import met representatieve voorbeeldbestanden en controleer zowel de verwachte uitkomsten als het gedrag bij afwijkende invoer. Alleen een bestand met keurige waarden testen geeft weinig zekerheid: verschillen in spreadsheetprogramma’s, encodings en kolomindeling kunnen pas met realistische bestanden aan het licht komen. Gebruik geen echte persoonsgegevens als synthetische voorbeelden volstaan.

  • Maak testbestanden voor normale invoer, lege waarden, ongeldige waarden en afwijkende kolomvolgorde.
  • Controleer aantallen, veldwaarden, foutmeldingen en eventuele databasewijzigingen.
  • Bewaar eerder gevonden probleemgevallen als regressietests, zodat een latere wijziging ze niet opnieuw introduceert.
  • Test ook bestanden die uit de belangrijkste bronsystemen zijn geëxporteerd.

Wanneer moet ik een grote CSV- of Excel-import asynchroon verwerken?

Verwerk een import asynchroon wanneer het inlezen en valideren lang genoeg duurt om een gebruiker te laten wachten of wanneer de taak niet betrouwbaar binnen de limieten van een webverzoek past. Er is geen universele bestandsgrootte waarbij dat nodig wordt: het aantal rijen, de complexiteit van validatie en de beschikbare servercapaciteit bepalen samen de verwerkingstijd.

  • Meet de verwerkingstijd en het geheugengebruik met bestanden die op echte imports lijken.
  • Toon de gebruiker een taakstatus, zoals ontvangen, bezig, afgerond of mislukt.
  • Bewaar voldoende voortgangsinformatie om een onderbroken taak veilig te hervatten of opnieuw uit te voeren.
  • Stel grenzen in voor bestandsgrootte en verwerkingstijd, zodat één import de dienst niet overbelast.

Hoe maak ik een voorbeeldweergave voor een import zonder gegevens op te slaan?

Maak een voorbeeldweergave door het bestand door dezelfde lees-, mapping- en validatiestappen te sturen als een echte import, maar de databasewijzigingen over te slaan. Zo kan de gebruiker vóór verwerking controleren of de kolommen en waarden goed worden geïnterpreteerd. Vermeld duidelijk dat de voorbeeldweergave nog niets heeft opgeslagen en dat de uiteindelijke uitkomst kan veranderen als brongegevens tussentijds wijzigen.

  • Toon een beperkt aantal voorbeeldrijen met herkende kolomnamen en eventuele waarschuwingen.
  • Geef ook een samenvatting van geldige en ongeldige rijen.
  • Laat de gebruiker vóór bevestiging een verkeerde kolomkeuze corrigeren.
  • Voer de definitieve validatie opnieuw uit bij het opslaan; vertrouw niet uitsluitend op een eerdere voorbeeldcontrole.

Hoe sla ik geüploade importbestanden tijdelijk veilig op?

Sla geüploade bestanden tijdelijk op met een willekeurige bestandsnaam in een afgeschermde opslaglocatie die niet rechtstreeks via een openbare URL bereikbaar is. Vertrouw niet op de naam of extensie die de gebruiker aanlevert. Beperk wie het bestand kan lezen en verwijder het zodra het niet meer nodig is, volgens een vastgelegde bewaartermijn.

  • Bewaar de oorspronkelijke bestandsnaam alleen als metadata wanneer die nodig is voor het importverslag.
  • Controleer bestandstype en grootte vóór verdere verwerking.
  • Voorkom dat uploads uitvoerbaar zijn of als webpagina worden aangeboden.
  • Leg vast wie een bestand heeft geüpload en welke import erbij hoort, zonder gevoelige inhoud onnodig te loggen.
Portret van Maarten

Maarten

Freelance developer in Nijmegen

Even kennismaken?

Vertel kort wat er speelt. Dan hoor je wat er kan, wat ik anders zou doen en waar AI bij jou wél en niet iets toevoegt. Vrijblijvend.

[email protected]
Het kantoor in Nijmegen
© 2026 maarten.online Sitemap Privacy Algemene voorwaarden
Het kantoor in Nijmegen

Maarten.

Freelance developer in Nijmegen. Liever direct contact? Dat kan ook.

Kennismaken

Laat je gegevens achter, dan kijken we of het klikt. Vrijblijvend en zonder verkooppraat.

Maarten

Stuur een bericht via WhatsApp

Hoi! Waar kan ik je mee helpen?

nu