CSV-bestanden: het formaat zonder types, zonder codering en zonder commissie
Wat een CSV echt is, waarom hetzelfde bestand in twee spreadsheets anders opent en wat de regels voor aanhalingstekens zeggen. Converteer CSV in je browser.
In één oogopslag
- Type
- Documenten
- Extensies
- .csv
- MIME-type
- text/csv
Een .csv-bestand is een tekstbestand. Er is geen kop, geen versie, geen informatie over types en niets binairs — open er een in Kladblok en je ziet elke byte ervan. Elke regel is een rij, en iets scheidt de velden. Dat is het hele formaat, en daarom kan alles er een schrijven en zijn geen twee programma’s het eens over wat er een betekent.
Lees meer
Het ging vijfentwintig jaar zonder specificatie. RFC 4180 kwam er in 2005 en is uitdrukkelijk informatief en geen standaard — het beschrijft wat de meeste uitvoeringen doen in plaats van iemand iets voor te schrijven. Wat het wel regelt, zijn de aanhalingstekens: een veld met het scheidingsteken, een aanhalingsteken of een regeleinde wordt tussen dubbele aanhalingstekens gezet, en een aanhalingsteken binnen zo’n veld wordt dubbel geschreven. Die regel is het verschil tussen “Widget, groot” als één cel of als twee, en het is de regel die naïeve parsers overslaan.
Het scheidingsteken is niet betrouwbaar een komma. Een spreadsheet die draait in landinstellingen waarin decimalen als 1,5 worden geschreven, zoals in Nederland, kan de komma niet ook gebruiken om velden te scheiden, dus Excel exporteert daar puntkomma’s — op dezelfde computer, uit hetzelfde menu, en het levert een bestand op dat het buurland niet kan openen. Exports uit databases gebruiken vaak tabs. Elke tool die CSV goed leest, raadt het scheidingsteken uit de eerste paar regels, en dat doet deze site ook.
Er is ook geen verklaring van de codering, en hier gaan de gegevens echt verloren. Een CSV met Chinese namen, opgeslagen door het ene programma en geopend door een ander, komt terug als wartaal, omdat het ene van UTF-8 uitging en het andere van de systeemcodetabel. En omdat elk veld tekst zonder type is, raadt een spreadsheet bij het importeren opnieuw: voorloopnullen verdwijnen uit onderdeelnummers, lange id’s worden wetenschappelijke notatie, en alles wat op een datum lijkt, wordt er een. Het bestand was in orde; het lezen ervan niet.
CSV naar andere formaten converteren
CSV — veelgestelde vragen
Is een CSV gewoon een tekstbestand?
Ja, volledig. Geen container, geen compressie, niets binairs. Elke teksteditor opent het, en wat je ziet, is wat erin staat.
Waarom gebruikt mijn CSV puntkomma’s?
Omdat het is geëxporteerd in landinstellingen waarin de komma het decimaalteken is, dus de komma kon niet ook velden scheiden. Het is nog steeds een CSV, en elke lezer die de moeite waard is, herkent het scheidingsteken in plaats van het aan te nemen.
Waarom zijn mijn voorloopnullen verdwenen?
Omdat CSV geen types opslaat en de spreadsheet heeft geraden. “007” lijkt op een getal, dus werd het 7. Er was niets mis met het bestand — de import besliste. De meeste spreadsheets laten je bij het importeren een kolom op tekst zetten, en dat is de enige betrouwbare oplossing.
Waarom is mijn Chinese tekst onleesbaar?
Omdat het bestand niet vermeldt welke codering het heeft, en het programma dat het opent anders raadde dan het programma dat het schreef. Opslaan als UTF-8 met een bytevolgordemarkering zorgt dat Excel het goed leest, ten koste van een markering die sommige andere tools als vreemde tekens tonen.
Kan ik hier een CSV naar PDF converteren?
Ja. Het wordt als CSV geparseerd in plaats van op komma’s gesplitst, dus velden tussen aanhalingstekens blijven heel, en de kolommen passen zich aan de inhoud aan met de koprij vet. Wat je krijgt, is om te lezen en af te drukken — niets in een PDF kan worden gesorteerd of opgeteld.
En converteren naar Excel?
Niet nodig: elk spreadsheetprogramma opent een CSV rechtstreeks, en eerst converteren voegt alleen een stap toe waarin de types worden geraden. De conversie die hier wel bestaat, gaat de andere kant op — PDF naar Excel, dat een tabel opbouwt uit een pagina die er nooit een vastlegde.