prepareData.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. const config = require('../build.json');
  5. // Change current directory to script location so that
  6. // the relative paths of the resources can be resolved
  7. process.chdir(path.dirname(process.argv[1]));
  8. function createDirectory(dir) {
  9. fs.mkdirSync(
  10. dir,
  11. { recursive: true },
  12. (error) => {
  13. if (error !== null) {
  14. console.error('Error while creating directory', error);
  15. }
  16. }
  17. );
  18. }
  19. function transformData() {
  20. var matrix = fs.readFileSync(path.join('../', config.path.data, 'risk-ladder.tsv'), 'utf8');
  21. // TSV wird geparst
  22. matrix = matrix.split('\n').map(l => l.split('\t'));
  23. var rowCount = matrix.length - 1;
  24. var colCount = matrix[0].length;
  25. var result = {reasons:[], filters:[]};
  26. var filters = new Map();
  27. var basisrisiko;
  28. // Die einzelnen Einträge werden ausgelesen
  29. for (var r = 1; r < rowCount; r++) {
  30. result.reasons[r-1] = {
  31. title: matrix[r][1],
  32. info: matrix[r][2],
  33. source: matrix[r][23],
  34. url: matrix[r][24],
  35. year: matrix[r][26],
  36. evidence: matrix[r][25],
  37. referenceGroup: matrix[r][27],
  38. comment: matrix[r][28],
  39. cat: matrix[r][0]
  40. };
  41. }
  42. // Data expected in tsv
  43. var ageGroups = ['', '1-13','14-17','18-20','21-59','60+'];
  44. var genders = ['', 'm', 'w'];
  45. var offset = 5;
  46. for (var c = offset; c < colCount; c++) {
  47. var alter = undefined, geschlecht = undefined;
  48. if (c < genders.length * ageGroups.length + offset) {
  49. // gender order: neutral | male | female
  50. switch ((c-offset) % genders.length) {
  51. case 0: geschlecht = ''; break;
  52. case 1: geschlecht = 'm'; break;
  53. case 2: geschlecht = 'w'; break;
  54. }
  55. // age group changes every genders.length column
  56. alter = ageGroups[Math.floor((c-offset) / genders.length)];
  57. }
  58. if (alter === undefined && geschlecht === undefined) continue;
  59. if (alter === undefined || geschlecht === undefined) throw Error([alter, geschlecht].join('\n'));
  60. var key = alter + '_' + geschlecht;
  61. var filter = {
  62. alter:alter,
  63. geschlecht:geschlecht,
  64. entries:[]
  65. };
  66. result.filters.push(filter);
  67. if (filters.has(key)) throw Error();
  68. filters.set(key, true);
  69. for (var r = 1; r < rowCount; r++) {
  70. var val = parseFloat(matrix[r][c].replace(/,/g, '.'));
  71. var value;
  72. if (isNaN(val)) {
  73. value = 1;
  74. } else {
  75. value = val;
  76. }
  77. filter.entries[r-1] = value;
  78. }
  79. // // Risiko wird aus Basisrisiko und Faktorisierung berechnet
  80. if (key === '_') {
  81. basisrisiko = filter.entries;
  82. } else {
  83. filter.entries = filter.entries.map(function (v,i) {
  84. var val = v;
  85. if (isNaN(v)) {
  86. val = 1;
  87. } else {
  88. val = Math.round(v * basisrisiko[i] * 1e10) / 1e10;
  89. }
  90. return val;
  91. });
  92. }
  93. }
  94. fs.writeFileSync(path.join('../', config.path.build, 'data_de.json'), JSON.stringify(result, null, '\t'), 'utf8');
  95. }
  96. createDirectory(path.join('../', config.path.build));
  97. createDirectory(path.join('../', config.path.output));
  98. transformData();