Tabellenchaos temmen vanaf de terminal
Als je regelmatig data-exports ontvangt, ken je vast de frustratie. Een bestand van driehonderd megabyte, Windows-1251-codering, scheidingsteken is ergens een puntkomma en ergens een komma, en er zijn niet-ge-escapete regelovergangen binnen rijen. Dit in Excel openen is een gegarandeerde manier om je kantoorsoftware volledig te bevriezen of per ongeluk voorloopnullen van telefoonnummers te verwijderen. Een snel Python-script met pandas schrijven voor een simpele controle is ook een gedoe.
In zulke situaties komt csvkit te hulp — een set command-line utilities voor het werken met tabelgegevens. Het project staat sinds 2011 op GitHub, heeft meer dan 64.000 sterren verzameld en blijft een van de meest handige manieren om CSVs direct in bash te ontleden.
Wat deze set utilities kan doen
De makers van het pakket, journalistiek platform Wire Services, lieten zich inspireren door tools zoals pdftk en GDAL. Het idee is simpel: geef ontwikkelaars en data-analisten een set gespecialiseerde commando's voor UNIX-pipelines om tabelbestanden te reinigen, te snijden, te formatteren en te verkennen zonder code te schrijven.
De utilities zijn opgedeeld per taak: conversie, snijden, analyse en SQL-query-uitvoering.
Snelle preview en basisstatistieken
Het csvlook commando zet ruwe CSV om in een nette ASCII-tabel met correcte kolomuitlijning. Gecombineerd met head of less krijg je een uitstekende preview:
head -n 20 data.csv | csvlook
Als je de structuur van een onbekend bestand wilt begrijpen, voer dan csvstat uit. De utility analyseert datatypes in elke kolom, vindt ontbrekende waarden, berekent minimum, maximum, gemiddelde en toont een lijst van de meest voorkomende waarden:
csvstat data.csv
Snijden en filteren
Traditionele UNIX-utilities zoals cut en grep werken vaak niet goed bij complexe CSVs wanneer komma's of regelovergangen binnen gequote velden voorkomen. Het pakket heeft gespecialiseerde alternatieven:
Met csvcut kun je de benodigde kolommen op naam of nummer uitsnijden:
csvcut -c "user_id,email,status" users.csv > clean_users.csv
Met csvgrep filter je rijen op waarden of reguliere expressies:
csvgrep -c "status" -m "active" users.csv
SQL direct bovenop bestanden
Een van de meest handige commando's is csvsql. Het kan twee dingen doen. Ten eerste genereert het een DDL-schema voor PostgreSQL, MySQL of SQLite op basis van analyse van datatypes in het bestand. Ten tweede kun je SQL-queries direct uitvoeren op CSV-bestanden op schijf via ingebouwde SQLite:
csvsql --query "select status, count(*) from users group by status" users.csv
Je kunt ook twee verschillende bestanden samenvoegen alsof het reguliere databasetabellen zijn:
csvsql --query "select u.name, o.total from users u join orders o on u.id = o.user_id" users.csv orders.csv
Formaatconversie
Het in2csv hulpmiddel converteert zo ongeveer alles naar CSV: Excel-bestanden (.xls en .xlsx), JSON, NDJSON en bestanden met vaste breedte. Geen noodzaak om Excel te openen om een ontvangen rapport opnieuw op te slaan:
in2csv report.xlsx --sheet "Sales" > sales.csv
Hoe het onder de motorkap werkt
Het pakket is geschreven in Python en gedistribueerd via PyPI. Het gebruikt SQLAlchemy voor databasebewerkingen, wat de flexibiliteit van csvsql verklaart bij het werken met verschillende SQL-dialecten.
Het belangrijkste voordeel van de architectuur is compatibiliteit met standaard invoer en uitvoer (stdin/stdout). Commando's kunnen eenvoudig worden gekoppeld via een gewone pipe:
in2csv data.xlsx | csvgrep -c "country" -m "RU" | csvcut -c 1,3,5 | csvlook
Deze aanpak heeft echter een nadeel. Omdat de library in pure Python is geschreven met runtime type-checking, daalt de prestaties bij bestanden van meerdere gigabytes. Voor exports op terabyte-schaal kun je beter xsv in Rust of duckdb gebruiken, maar voor alledaagse taken tot een paar honderd megabytes is csvkit's snelheid meer dan voldoende.
Waar het in de praktijk van pas komt
- Controleren van datastructuur op een remote server zonder GUI.
- Bestanden vooraf reinigen in bash-scripts voordat ze in een ETL-pipeline worden geladen.
- Databasetabel-schema's genereren voor een nieuwe export (
csvsql -i postgresql data.csv). - Snel twee verschillende bestanden samenvoegen op een gemeenschappelijke sleutel via
csvjoin.
Is het de moeite waard om te installeren
Het pakket installeer je met een enkel pip-commando:
pip install csvkit
Als je vaak logs parseert, werkt met database-imports of rapporten ontvangt als archieven met Excel en CSV, zal deze set utilities je veel zenuwen besparen. Het elimineert de noodzaak om een zware editor te openen of eenmalige scripts te schrijven voor basisfiltering van twee kolommen. Begin met csvlook en in2csv — die verdienen de installatie in de eerste vijf minuten gebruik.
Gerelateerde projecten