CSV er et av de formatene som ingen elsker men alle bruker. Det har eksistert siden 1970-tallet, det er fortsatt standard eksportformat for alle regnearkapper på planeten, og det sitter nesten sikkert et sted i datapipelinen din akkurat nå. Formatet ser trivielt enkelt ut — bare verdier skilt med komma — men å parse det riktig er overraskende lett å gjøre feil. La oss gå gjennom hvordan det faktisk fungerer, hvor det blir rotet til, og hvordan du håndterer det i Python og JavaScript uten å skyte deg selv i foten.
Hva CSV Faktisk Er
CSV står for Comma-Separated Values (kommaseparerte verdier). En CSV-fil er ren tekst — ingen binær koding, ingen metadata, ingen struktur utover rader og kolonner. Hver linje er en post, hver verdi innen en linje er atskilt med et skilletegn (vanligvis et komma), og den første raden er konvensjonelt en overskriftsrad med kolonnenavn. Her er hva en ekte CSV ser ut:
order_id,customer,product,quantity,unit_price,shipped
1001,Alice Nguyen,USB-C Hub,2,34.99,true
1002,Bob Martinez,Mechanical Keyboard,1,129.00,false
1003,Alice Nguyen,HDMI Cable,3,12.50,true
1004,Carol Smith,Webcam 1080p,1,79.95,falseDet er alt — seks kolonner, fire datarader og en overskrift. Ingen vinkelparenteser, ingen krøllparenteser, ingen anførselstegn
nødvendig (ennå). Denne enkelheten er nøyaktig grunnen til at CSV vedvarer: nesten alle verktøy på planeten kan åpne, lese og produsere det.
Excel, Google Sheets, PostgreSQL's COPY-kommando, pandas, R's read.csv() — alle CSV
ut av boksen. Avveiningen er at formatet har nesten ingen struktur: ingen typer, ingen nesting, ingen skjema.
Alle verdier er strenger til du bestemmer noe annet.
RFC 4180 — Standarden Som Egentlig Ikke Håndheves
Det finnes en spesifikasjon: RFC 4180, publisert i 2005. Den definerer ting som CRLF-linjeavslutninger, dobbel-anførsels-tegn-escapeing og hvordan man håndterer innebygde komma. Men her er saken — RFC 4180 er informasjonell, ikke en standard. Den beskriver hva som allerede var vanlig praksis, ikke lovgiver det. Ingen er pålagt å følge den, og i praksis gjør nesten ingen det nøyaktig.
Resultatet er CSV-dialektkaos. Du har filer som bruker LF i stedet for CRLF, filer der den første raden kan eller ikke kan være en overskrift, filer med en etterfølgende nymlinje og filer uten, filer med en UTF-8 BOM som Excel har lagt foran. Wikipedia-artikkelen om CSV har en solid gjennomgang av alle tingene som varierer i praksis. Den sikreste tilnærmingen: anta aldri noe om en CSV-fil du ikke har produsert selv, og bruk alltid en skikkelig parser i stedet for naivt å splitte på komma.
Anførselstegnregler: Når Komma Vises Inne i Verdier
Dette er der "bare splitt på komma" bryter sammen. Hva skjer når en verdi inneholder et komma? Eller en nymlinje? Eller dobbelt anførsels-tegn? RFC 4180 — og de fleste virkelige parsere — håndterer det ved å pakke inn feltet i doble anførsels-tegn. Her er hele settet med regler:
- Hvis et felt inneholder et komma, en nymlinje eller dobbelt anførsels-tegn, pakk hele feltet inn i doble anførsels-tegn
- Hvis et felt inneholder dobbelt anførsels-tegn, escape det ved å doble det (
"") - Siterte felt kan spenne over flere linjer — nymlinja blir en del av verdien
- Mellomrom inne i anførsels-tegn er signifikant og må bevares
order_id,customer,notes,unit_price
1005,David Lee,"Wants gift wrapping, express shipping",45.00
1006,Emma Brown,"Said: ""please handle with care""",89.99
1007,Frank Wu,"Address:
123 Main St
Apt 4B",15.50I det eksempelet: Davids notes inneholder et komma, så det er sitert. Emmas notat inneholder
doble anførsels-tegn, så de er doblet opp inne i de ytre anførsels-tegnene. Franks adresse strekker seg over flere linjer — linjeskiftene
er en del av verdien. En naiv line.split(',') i et hvilket som helst språk vil fullstendig ødelegge
alle tre av disse. Det er derfor du trenger en ekte parser.
split gjøre riktig.Skilletegn-varianter: Tabulatorer, Semikolon, Piper
Til tross for navnet trenger ikke CSV å bruke komma. Flere vanlige varianter bruker forskjellige skilletegn, og du vil møte alle av dem i naturen:
- TSV (Tab-Separated Values) — bruker
\tsom skilletegn. Vanlig i bioinformatikk (BLAST-utdata, VCF-filer), database-eksporter, og overalt der verdiene selv ofte inneholder komma - Semikolon-separert — standarden i Excel for steder der komma er desimalseparatoren (Tyskland, Frankrike, de fleste EU-land). Hvis du noen gang har åpnet en CSV fra en europeisk kollega og fått én enorm kolonne, er dette grunnen
- Pipe-separert — bruker
|. Vanlig i eldre bank- og forsikrings-dataeksporter der tabulatorer kan bli fjernet av mainframe-systemer - Fast bredde — ikke teknisk sett CSV, men ofte gruppert i samme kategori. Kolonner er polstret til faste bredder i stedet for avgrenset
De fleste CSV-parsere lar deg spesifisere skilletegnet eksplisitt. Når du skriver en CSV som andre vil konsumere, dokumenter skilletegnet ditt. Når du leser en du ikke produserte, sjekk de første linjene før du antar. CSV-formatering-verktøyet kan hjelpe deg å inspisere og formatere filer med ikke-standard skilletegn.
Parse CSV i Python
Pythons standardbibliotek inkluderer
csv-modulen,
og den er genuint god. De to klassene du vil bruke mest er csv.reader for rad-som-liste-tilgang
og csv.DictReader for rad-som-dict-tilgang (som nesten alltid er det du vil ha).
import csv
# csv.reader — each row is a list of strings
with open('orders.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
header = next(reader) # consume the header row
for row in reader:
order_id, customer, product, quantity, price, shipped = row
print(f"Order {order_id}: {quantity}x {product} for {customer}")
# csv.DictReader — each row is an OrderedDict keyed by the header
with open('orders.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
for row in reader:
if row['shipped'] == 'false':
print(f"Pending: {row['order_id']} — {row['customer']}")To ting å alltid inkludere: encoding='utf-8' (eller hva filen faktisk bruker),
og newline=''. Det andre er kritisk — csv-modulen gjør sin egen nymlinjehåndtering
og trenger rå byte. Uten newline='' kan du få ekstra tomme rader på Windows.
Skriving er like grei med csv.writer:
import csv
orders = [
{'order_id': 1008, 'customer': 'Grace Kim', 'product': 'Laptop Stand', 'quantity': 1, 'unit_price': 49.99, 'shipped': False},
{'order_id': 1009, 'customer': 'Henry Park', 'product': 'USB-C Hub', 'quantity': 2, 'unit_price': 34.99, 'shipped': True},
]
with open('new_orders.csv', 'w', encoding='utf-8', newline='') as f:
fieldnames = ['order_id', 'customer', 'product', 'quantity', 'unit_price', 'shipped']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(orders)
# To use a different delimiter (e.g. tab-separated)
with open('new_orders.tsv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, delimiter='\t')
writer.writerow(['order_id', 'customer', 'product'])
writer.writerow([1008, 'Grace Kim', 'Laptop Stand'])csv-modulen tar seg av all anførsels-tegnsetting automatisk — hvis et felt inneholder et komma
eller en nymlinje, pakker den det inn i doble anførsels-tegn uten at du trenger å tenke på det. Det er hele poenget
med å bruke et bibliotek.
Parse CSV i JavaScript / Node.js
JavaScript har ingen innebygd CSV-parser. Fristelsen er å gjøre dette:
// ❌ Don't do this — breaks immediately on quoted fields
const rows = csvText.split('\n').map(line => line.split(','));Det feiler i det øyeblikket en verdi inneholder et komma, en nymlinje inne i anførsels-tegn eller et escaped dobbelt anførsels-tegn. For noe reelt, bruk et bibliotek. PapaParse er go-to-valget — det er raskt, håndterer alle grensetilfellene, fungerer i både nettleser og Node.js, og støtter strømming for store filer.
import Papa from 'papaparse';
import fs from 'fs';
// Parse a CSV string
const csvText = fs.readFileSync('orders.csv', 'utf8');
const result = Papa.parse(csvText, {
header: true, // first row becomes object keys
skipEmptyLines: true, // ignore blank lines at end of file
dynamicTyping: true, // converts "true"/"false" to booleans, numbers to numbers
});
console.log(result.data);
// [
// { order_id: 1001, customer: 'Alice Nguyen', product: 'USB-C Hub', quantity: 2, unit_price: 34.99, shipped: true },
// { order_id: 1002, customer: 'Bob Martinez', product: 'Mechanical Keyboard', quantity: 1, unit_price: 129, shipped: false },
// ...
// ]
// Check for parse errors
if (result.errors.length > 0) {
console.error('Parse errors:', result.errors);
}
// Generate CSV from an array of objects
const orders = [
{ order_id: 1008, customer: 'Grace Kim', product: 'Laptop Stand', quantity: 1, unit_price: 49.99 },
{ order_id: 1009, customer: 'Henry Park', product: 'USB-C Hub', quantity: 2, unit_price: 34.99 },
];
const csvOutput = Papa.unparse(orders);
fs.writeFileSync('export.csv', csvOutput, 'utf8');dynamicTyping-alternativet er hendig men verdt å vite om — det konverterer ting som
"34.99" til et tall automatisk. Det er vanligvis det du vil ha, men det kan overraske deg hvis
et felt som order_id er et tall i CSV-en men du ville ha det som en streng.
Slå det av hvis du trenger strengt streng-utdata.
For raske konverteringer mellom CSV og andre formater håndterer CSV til JSON- verktøyet de fleste vanlige tilfeller i nettleseren uten noen kode — nyttig for engangsdatatransformasjoner. Det er også CSV til XML hvis du trenger å mate dataene inn i et XML-basert system.
Vanlige Fallgruver Du Garantert Vil Treffe
Selv med en god parser har CSV noen velkjente landminer. Her er de som dukker opp oftest:
- BOM-byte fra Excel. Når Excel eksporterer en CSV som "UTF-8", legger den ofte foran en
UTF-8 BOM (
EF BB BFi heks, eller\ufeffsom et tegn). Dette gjør at den første kolonneoverskriften ser ut somorder_idi stedet fororder_id. I Python, åpne filen medencoding='utf-8-sig'i stedet forutf-8for å fjerne den automatisk. PapaParse håndterer det gjennomsiktig. - CRLF vs LF-linjeavslutninger. RFC 4180 spesifiserer CRLF (
\r\n), men Unix- verktøy produserer LF (\n) og gamle Mac-filer bruker CR (\r) alene. Det er derfor Pythonscsv-modul trengernewline=''— den håndterer alle tre internt. Hvis du leser rå byte og splitter manuelt, må du stripe\reksplisitt. - Kodingsproblemer. CSV har ingen måte å deklarere sin egen koding — i motsetning til HTMLs
<meta charset>eller XMLs<?xml encoding="..."?>. Excel lagrer ofte filer i Windows-1252 (a.k.a. CP1252) i stedet for UTF-8, som ødelegger tegn med aksenter. Hvis du ser tegn soméi stedet foré, har du en UTF-8-fil som dekodes som Latin-1, eller omvendt. Avklar alltid koding utenfor båndet med den som produserer filen. - Tall som ser ut som datoer. Excel konverterer stilltiende verdier som
1-2eller03/04til datoer ved åpning eller lagring. Hvis du eksporterer produktkoder eller versjonsnumre, sett dem foran med en enkelt apostrof i Excel ('1-2) for å forhindre dette — eller si det til den som produserer filen. - Etterfølgende komma. Noen eksportører sender et etterfølgende komma på slutten av hver linje, som skaper en fantomkolonne som er tom. En robust parser ignorerer det; en naiv split lager et ekstra tomt strengelement.
Hvis du har med en fil å gjøre som ser merkelig ut, kan CSV-validator- verktøyet raskt fortelle deg om filen er velformet og flagge koding- eller strukturproblemer før du prøver å behandle den.
CSV vs JSON vs Excel — Når Bruker Man Hva
Disse tre formatene overlapper mye i praksis, men hvert har et tydelig brukstilfelle:
- Bruk CSV når du flytter flate, tabellformede data mellom systemer — database-eksporter, analysepipeliner, regnearkimporter, bulk-datalasting. Det støttes universelt, er lite i størrelse og trivielt å diff-e i git. Begrensningen: det er flatt. Ingen nesting, ingen typer, ingen relasjoner.
- Bruk JSON når data er hierarkisk eller skjema er viktig. En ordre med flere linjeelemenenter, en konfigurasjonsfil med nestede objekter, et API-svar — disse er naturlig JSON. CSV ville tvinge deg til å denormalisere dataene eller finne opp din egen nestingkonvensjon. JSON-spesifikasjonen er ren og entydig; formatet bevarer typer (tall, booleaner, null, matriser, objekter).
- Bruk Excel (.xlsx) når utdataene er for mennesker, ikke maskiner. Formatering, formler, flere ark, diagrammer — hvis en forretningsbruker er den endelige forbrukeren, er Excel ofte det rette valget. Bruk det bare aldri som et utvekslingsformat mellom systemer. OOXML-spesifikasjonen er enorm og formatet er skjørt på tvers av versjoner.
Det er en praktisk tommelfingerregel: hvis du naturlig ville se dataene i et regneark, er CSV sannsynligvis greit. Hvis du ville se dem i et tre eller en kodeeditor, bruk JSON. Hvis du sender det til en forretningsstakeholder som vil filtrere og sortere det, bruk Excel.
Oppsummering
CSV er enkelt etter design og bedragerisk vanskelig i praksis. Formatet har ingen håndhevet standard,
leveres i flere skilletegn-varianter, og er avhengig av anførsels-tegn-regler som ødelegger alle manuelle parseforsøk.
Løsningen er alltid den samme: bruk en ekte parser (Pythons innebygde csv-modul, eller PapaParse
i JavaScript), spesifiser alltid kodingen eksplisitt, og pass opp for BOM-byte fra Excel. Når du
har en pålitelig parser på plass, er CSV faktisk et flott format — raskt å produsere, lett å inspisere i en hvilken som helst
teksteditor, og støttet overalt. For daglig arbeid med CSV-filer håndterer
CSV til JSON, CSV-formatering og
CSV-validator-verktøyene de vanlige operasjonene uten å skrive en linje kode.