Published

Netherlands (NL) build pipeline

Postal Codes Dataset for Netherlands, NL including name of the city, town, or place, various administrative divisions and alternative city names.

Netherlands (NL) build pipeline

Not a live external fetch — converts an existing FedEx-schema delivery (~/Desktop/Research/fedex-agents-prototype/datahub-sales-deliveries/Netherlands_Delivery/Netherlands.csv, 467,630-row Universal Data Schema export, already QA'd upstream: validation_report.json there shows 0 errors) into this repo's 13-column postal-codes schema. convert_from_fedex.py's own docstring documents every place the two schemas disagree in detail — read it before changing anything. Summary:

  1. countryCode (NLD, alpha-3) -> country_code (NL, alpha-2).
  2. The 12-column FedEx schema has additionalInfo; the 13-column one has nowhere to put it. Only 10 of 467,630 rows use it — 8 say "Postal station: Cortelande" (genuinely lost in conversion, noted in data/README.md), 2 carry a licensing statement (see point 3).
  3. Licensing: the FedEx base source is CC0 1.0 (public domain, no attribution needed). Two rows were backfilled from the CBS woonplaatsen reference (CC-BY 4.0) — those two rows alone would drag the whole published file into an attribution obligation. They are exactly the two rows asserting postalCode "00000" (no postal code) — which don't belong in this product anyway (a list of postal codes has no home for a no-postal-code row; see CLAUDE.md, "Two Output Formats" in fedex-agents-prototype). Dropping them is correct on product grounds and keeps the published dataset cleanly CC0.
  4. place_name and admin_name3 both take cityName — legitimately the same value in NL (woonplaats is both the locality and the third admin tier). The pre-existing R2 nl.csv had admin_name3 as the literal string 'nan'; this replaces it with the real value.

Run order

python3 convert_from_fedex.py  # reads the FedEx delivery path above directly
python3 archive_nl_full.py     # archives the untruncated conversion before any drops
python3 integrity_checker.py
python3 package.py
python3 publish_r2.py          # dry run by default; --apply to publish

Verification (2026-08-19)

Confirmed the FedEx source file is real (not a stub) and ran the conversion fresh against a fresh copy of it: 467,628 rows (the 2 00000 rows correctly dropped per point 3 above), byte-identical (MD5 match) to both the pre-existing local copy and live R2. Publish dry-run correctly ignores the phantom nl-full.csv that _meta/catalog.json still references — that catalog staleness is isolated to the index, not this data or this script (see the separately-flagged stale-catalog issue for SG/DE/PT/NL/IT).