Sunday, 25 December 2011

NS API: stationslijst naar een array

Om de lijst met stations direct uit het geheugen te kunnen gebruiken plaats ik twee arrays: codes[] en names[] in mijn code.

Het converteren van de api xml output naar twee plaintext arrays was een aardige klus die steeds vaker terugkwam, omdat de NS nieuwe stations bouwde. Ik besloot om een script te schrijven.

Het was zonder twijfel veel mooier om een parser in een mooie programmeertaal te schrijven, maar de oefening met pipes en de commandos sed, awk, grep, paste en cut was leuk.

Het script converteert uppercase stationscodes naar lowercase, internationale karakters (umlaut etc.) naar normale karakters en haalt enkele stations zoals "Utrecht" weg omdat er ook al een "Utrecht Centraal" bestaat. Ik besloot verder om namen als Munchen te schrijven als Munchen (zonder umlaut) om het typen te vergemakkelijken.



#!/bin/bash
cat ns_api_stations.xml | grep code | sed s/\<[\/a-z]*\>//g | sed 's/^[ \t]*//' | awk '{print "\"" tolower($0) "\","}' > codes.txt

cat ns_api_stations.xml | grep name | sed s/\<[\/a-z]*\>//g | sed 's/^[ \t]*//' | sed 's/[àâä]/a/g; s/[ÀÂÄ]/A/g; s/[éèêë]/e/g; s/[ÉÈÊË]/E/g; s/[îï]/i/g;
s/[ÎÏ]/I/g; s/[ôö]/o/g; s/[ÖÔ]/O/g; s/[ûüù]/u/g; s/[ÛÜÙ]/U/g; s/ç/c/g; s/Ç/C/g' | awk '{print "\"" $0 "\","}' > names.txt


paste codes.txt names.txt | grep -v '"Amsterdam"' | grep -v '"Almere"' | grep -v '"Berlijn"' | grep -v '"Eschmarke"' | grep -v '"Den Haag"' | grep -v '"Utrecht"' | grep -v '"Leiden"' | grep -v '"Rotterdam"' > merged

cut -f1 < merged > codes.txt
cut -f2 < merged > names.txt
rm merged