Adressen CSV bestanden zijn veel directer te 'manipuleren', d.w.z. te filteren, bewerken, converteren, etc met de commandline tool Miller. Dankzij een reply op Mastodon na ons publiceren van het Kennisartikel over CSV verwerking met SQLIte, werd Miller onder onze aandacht gebracht. Miller biedt veel snellere en directere methoden omdat de CSV niet eerst in een database (PostGIS, SQLite, MSSQL etc) ingelezen hoeft te worden. Hopelijk voor u kunnen meerdere use-cases met Miller gerealiseerd worden. Ja, CSVs kunnen ook nog met DuckDB [2] verwerkt...Dit volgt later.


Wat is Miller?


Uit Engels vertaald: "Miller is een commandline-tool voor het opvragen, vormgeven en opnieuw formatteren van gegevensbestanden in verschillende formaten, waaronder CSV, TSV, JSON en JSON Lines."

Zie de uitstekende documentatie van Miller op: miller.readthedocs.io. Het Miller commando 'mlr' dient dus  uitgevoerd te worden in een 'Terminal Shell', op Mac programma Terminal, in Linux Shell zoals Bash, en onder Windows in Powershell, of beter in MS WSL.


Miller Installatie


Staat in detail beschreven in de Miller documentatie. Op de Mac ging dit eenvoudig met 'brew install miller'.

Uiteindelijk dient het commando 'mlr' beschikbaar te zijn. Test de installatie met commando:

mlr --help


Dit moet zinvolle output geven


Voorbeelden


Hier een aantal voorbeelden equivalent aan die in ons SQLite Artikel. U kunt bijvoorbeeld een proefbestand downloaden uit de GeoCatalogus. Hier BAG Adressen Woning CSV. Bewaar deze als 'adres.csv'. Deze wordt in de voorbeelden hieronder bevraagd.


Uitfilteren adressen in Gemeente Terneuzen.


mlr --icsv --ocsv --fs ';' filter '$gemeente == "Terneuzen"' adres.csv > terneuzen.csv


Dit lijkt cryptisch maar de mlr-commando opbouw is erg logisch: 

  • --icsv geeft aan dat de input een CSV bestand, althans formaat is
  • --ocsv geeft aan dat de output het CSV formaat is
  • --fs ';' geeft aan dat de kolom-scheider ('field-separator') puntkomma is
  • filter '$gemeente == "Terneuzen"' rijen uitfilteren met deze kolom-eigenschap
  • bagadres-basis.csv het bron-CSV bestand
  • > terneuzen.csv geeft aan om het resultaat naar een nieuw CSV bestand te schrijven


Of zelfs een ruimtelijke 'bounding box' query, met meerdere condities en kolommen (x,y):


mlr --icsv --ocsv --fs ';' filter '$x > 100000 && $x < 150000 && $y > 485000 && $y < 490000 ' adres.csv > bbox.csv


Alle adressen met een gebruiksdoel 'industriefunctie':


mlr --icsv --ocsv --fs ';' filter '$industriefunctie == 1' adres.csv > industrie.csv

Links


[1]  https://miller.readthedocs.io

[2] https://duckdb.org/docs/stable/data/csv/overview