diff --git a/bag/db/data/gemeentelijke-indeling.xml b/bag/db/data/gemeentelijke-indeling.xml
index 011ee8bb..90721b89 100644
--- a/bag/db/data/gemeentelijke-indeling.xml
+++ b/bag/db/data/gemeentelijke-indeling.xml
@@ -16115,4 +16115,767 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bag/src/gemeentelijke-indeling.py b/bag/src/gemeentelijke-indeling.py
index 2fbf46f5..ca971b24 100644
--- a/bag/src/gemeentelijke-indeling.py
+++ b/bag/src/gemeentelijke-indeling.py
@@ -39,10 +39,12 @@
import re
import copy
import datetime
-import xlrd
from collections import defaultdict
from etree import etree, stripschema
+import openpyxl
+import xlrd
+
class ArgParser(argparse.ArgumentParser):
def error(self, message):
@@ -240,12 +242,182 @@ def add_gemeente(args, gemeentelijke_indeling, provincie_map):
return gemeentelijke_indeling
-def parse_cbs_data(args):
- if not os.access(args.file, os.R_OK):
+def get_column(args, header):
+ column = {}
+
+ # Gemeentecode Gemeentenaam Provincienaam Provinciecode
+ if (header[0] == 'Gemeentecode' and
+ header[1] == 'Gemeentenaam' and
+ header[2] == 'Provincienaam' and
+ header[3] == 'Provinciecode'):
+ column = {
+ 'gemeentecode': 0,
+ 'gemeentenaam': 1,
+ 'provincienaam': 2,
+ 'provinciecode': 3,
+ }
+
+ # Gemeentecode Provinciecode Gemeentenaam Provincienaam
+ elif (header[0] == 'Gemeentecode' and
+ header[1] == 'Provinciecode' and
+ header[2] == 'Gemeentenaam' and
+ header[3] == 'Provincienaam'):
+ column = {
+ 'gemeentecode': 0,
+ 'provinciecode': 1,
+ 'gemeentenaam': 2,
+ 'provincienaam': 3,
+ }
+
+ # prov_Gemcode provcode Gemcodel provcodel
+ elif (header[0] == 'prov_Gemcode' and
+ header[1] == 'provcode' and
+ header[2] == 'Gemcodel' and
+ header[3] == 'provcodel'):
+ column = {
+ 'gemeentecode': 0,
+ 'provinciecode': 1,
+ 'gemeentenaam': 2,
+ 'provincienaam': 3,
+ }
+
+ # Gemcode provcode Gemcodel provcodel
+ elif (header[0] == 'Gemcode' and
+ header[1] == 'provcode' and
+ header[2] == 'Gemcodel' and
+ header[3] == 'provcodel'):
+ column = {
+ 'gemeentecode': 0,
+ 'provinciecode': 1,
+ 'gemeentenaam': 2,
+ 'provincienaam': 3,
+ }
+
+ # Gemcode Gemcodel provcode provcodel
+ elif (header[0] == 'Gemcode' and
+ header[1] == 'Gemcodel' and
+ header[2] == 'provcode' and
+ header[3] == 'provcodel'):
+ column = {
+ 'gemeentecode': 0,
+ 'gemeentenaam': 1,
+ 'provinciecode': 2,
+ 'provincienaam': 3,
+ }
+
+ # Gemeentecode GemeentecodeGM Gemeentenaam Provinciecode ProvinciecodePV Provincienaam
+ elif (header[0] == 'Gemeentecode' and
+ header[1] == 'GemeentecodeGM' and
+ header[2] == 'Gemeentenaam' and
+ header[3] == 'Provinciecode' and
+ header[4] == 'ProvinciecodePV' and
+ header[5] == 'Provincienaam'):
+ column = {
+ 'gemeentecode': 0,
+ 'gemeentecodegm': 1,
+ 'gemeentenaam': 2,
+ 'provinciecode': 3,
+ 'provinciecodepv': 4,
+ 'provincienaam': 5,
+ }
+
+ # Unsupported format
+ else:
if args.verbose:
- print("Error: Cannot read CBS data file: " + args.file)
- return
+ order = ""
+
+ i = 0
+ for col in header:
+ if i > 0:
+ print(" | ")
+
+ print(col)
+
+ i += 1
+
+ print("Error: Unsupported header order: %s" % order)
+
+ return column
+
+
+def parse_xslx(args):
+ if args.verbose:
+ print("Parsing XLSX file: %s" % args.file)
+
+ workbook = openpyxl.load_workbook(args.file)
+
+ cbs_data = hash()
+
+ for sheet in workbook:
+ value = sheet.cell(row=1, column=1).value
+
+ if not value:
+ if args.verbose:
+ print("Warning: No value in cell 1,1, skipping worksheet: %s" % sheet.title)
+
+ continue
+
+ header = []
+ for col in sheet[1]:
+ header.append(col.value)
+
+ column = get_column(args, header)
+
+ if len(column) == 0:
+ return
+
+ row = 0
+ for r in sheet.values:
+ row += 1
+
+ if row == 1:
+ continue
+
+ record = {}
+
+ columns = ['gemeentecode', 'gemeentenaam', 'provinciecode', 'provincienaam']
+ for key in columns:
+ value = sheet.cell(row=row, column=column[key] + 1).value
+
+ record[key] = value
+ if ('gemeentecode' not in record and
+ 'gemeentenaam' not in record and
+ 'provinciecode' not in record and
+ 'provincienaam' not in record):
+ if args.verbose:
+ print("Empty row, stoppping here.")
+ break
+
+ if 'gemeentecode' not in record:
+ if args.verbose:
+ print("Empty 'gemeentecode' column (%s), stoppping here." % column['gemeentecode'])
+ break
+ if 'gemeentenaam' not in record:
+ if args.verbose:
+ print("Empty 'gemeentenaam' column (%s), stoppping here." % column['gemeentenaam'])
+ break
+ if 'provinciecode' not in record:
+ if args.verbose:
+ print("Empty 'provinciecode' column (%s), stoppping here." % column['provinciecode'])
+ break
+ if 'provincienaam' not in record:
+ if args.verbose:
+ print("Empty 'provincienaam' column (%s), stoppping here." % column['provincienaam'])
+ break
+
+ columns = ['gemeentecode', 'provinciecode']
+ for key in columns:
+ record[key] = strip_leading_zeros(record[key])
+
+ cbs_data[record['provinciecode']][record['gemeentecode']] = record
+
+ break
+
+ return cbs_data
+
+
+def parse_xsl(args):
if args.verbose:
print("Parsing XLS file: %s" % args.file)
@@ -270,100 +442,9 @@ def parse_cbs_data(args):
header.append(value)
- column = {}
-
- # Gemeentecode Gemeentenaam Provincienaam Provinciecode
- if (header[0] == 'Gemeentecode' and
- header[1] == 'Gemeentenaam' and
- header[2] == 'Provincienaam' and
- header[3] == 'Provinciecode'):
- column = {
- 'gemeentecode': 0,
- 'gemeentenaam': 1,
- 'provincienaam': 2,
- 'provinciecode': 3,
- }
-
- # Gemeentecode Provinciecode Gemeentenaam Provincienaam
- elif (header[0] == 'Gemeentecode' and
- header[1] == 'Provinciecode' and
- header[2] == 'Gemeentenaam' and
- header[3] == 'Provincienaam'):
- column = {
- 'gemeentecode': 0,
- 'provinciecode': 1,
- 'gemeentenaam': 2,
- 'provincienaam': 3,
- }
-
- # prov_Gemcode provcode Gemcodel provcodel
- elif (header[0] == 'prov_Gemcode' and
- header[1] == 'provcode' and
- header[2] == 'Gemcodel' and
- header[3] == 'provcodel'):
- column = {
- 'gemeentecode': 0,
- 'provinciecode': 1,
- 'gemeentenaam': 2,
- 'provincienaam': 3,
- }
-
- # Gemcode provcode Gemcodel provcodel
- elif (header[0] == 'Gemcode' and
- header[1] == 'provcode' and
- header[2] == 'Gemcodel' and
- header[3] == 'provcodel'):
- column = {
- 'gemeentecode': 0,
- 'provinciecode': 1,
- 'gemeentenaam': 2,
- 'provincienaam': 3,
- }
-
- # Gemcode Gemcodel provcode provcodel
- elif (header[0] == 'Gemcode' and
- header[1] == 'Gemcodel' and
- header[2] == 'provcode' and
- header[3] == 'provcodel'):
- column = {
- 'gemeentecode': 0,
- 'gemeentenaam': 1,
- 'provinciecode': 2,
- 'provincienaam': 3,
- }
-
- # Gemeentecode GemeentecodeGM Gemeentenaam Provinciecode ProvinciecodePV Provincienaam
- elif (header[0] == 'Gemeentecode' and
- header[1] == 'GemeentecodeGM' and
- header[2] == 'Gemeentenaam' and
- header[3] == 'Provinciecode' and
- header[4] == 'ProvinciecodePV' and
- header[5] == 'Provincienaam'):
- column = {
- 'gemeentecode': 0,
- 'gemeentecodegm': 1,
- 'gemeentenaam': 2,
- 'provinciecode': 3,
- 'provinciecodepv': 4,
- 'provincienaam': 5,
- }
-
- # Unsupported format
- else:
- if args.verbose:
- order = ""
-
- i = 0
- for col in header:
- if i > 0:
- print(" | ")
-
- print(col)
-
- i += 1
-
- print("Error: Unsupported header order: %s" % order)
+ column = get_column(args, header)
+ if len(column) == 0:
return
for row in range(1, sheet.nrows):
@@ -411,6 +492,20 @@ def parse_cbs_data(args):
return cbs_data
+def parse_cbs_data(args):
+ if not os.access(args.file, os.R_OK):
+ if args.verbose:
+ print("Error: Cannot read CBS data file: " + args.file)
+ return
+
+ if args.file.endswith('.xls'):
+ cbs_data = parse_xsl(args)
+ else:
+ cbs_data = parse_xslx(args)
+
+ return cbs_data
+
+
def add_cbs_data(args, gemeentelijke_indeling, cbs_data):
prev = get_last_year(gemeentelijke_indeling)
jaar = str(int(prev) + 1)