Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. const csv = require("csv");
  2. const process = require("process");
  3. const fs = require("fs");
  4. const _ = require("lodash");
  5.  
  6. const files = {
  7. source: "Explorer-NDC-Data.csv",
  8. meta: "Explorer-Nav-And-Legend-Data.csv",
  9. };
  10.  
  11. const fromCSV = (content) => {
  12. return new Promise((resolve, reject) => csv.parse(content, {
  13. columns: (row) => row.map((r) => r.split("\n")[0])
  14. }, (error, data) => {
  15. if (error) {
  16. return reject(error);
  17. }
  18.  
  19. return resolve(data);
  20. }));
  21. };
  22.  
  23. const numberedTaggedTitleRxp = /(\d+\.\ )?(.+)(VIS|TXT)/;
  24. const numberedTaggedTitle = (s) => {
  25. let match = s.match(numberedTaggedTitleRxp);
  26. return match && {
  27. number: match[1] && match[1].split(".")[0],
  28. title: match[2],
  29. tag: match[3],
  30. }
  31. };
  32.  
  33. const getBaseKey = (transformedSubCategory) => {
  34. return transformedSubCategory.number ?
  35. `${transformedSubCategory.number}. ${transformedSubCategory.title}` :
  36. `${transformedSubCategory.title}`
  37. };
  38.  
  39. const collectIndicators = (d) => _(d).reduce((accumulator, value, key) => {
  40. let transformedSubCategory = numberedTaggedTitle(key);
  41. if (transformedSubCategory) {
  42. let baseKey = getBaseKey(transformedSubCategory)
  43. accumulator[transformedSubCategory.title] = {
  44. vis: parseInt(d[`${baseKey}VIS`]),
  45. txt: d[`${baseKey}TXT`],
  46. };
  47. }
  48. return accumulator;
  49. }, {});
  50.  
  51. const transformMetadata = (source) => (m) => {
  52.  
  53. const transformedSubCategory = numberedTaggedTitle(m.subCategory);
  54. const baseKey = getBaseKey(transformedSubCategory);
  55.  
  56. return {
  57. title: m.subCategoryNamingTXT,
  58. mainCategory: m.belongsToMainCategory,
  59. slug: transformedSubCategory.title,
  60. legend: m.subCategoryLegendInfoTXT,
  61. legendBuckets: _(m).reduce((accumulator, value, key) => {
  62. let transformedSubCategory = numberedTaggedTitle(key);
  63. if (value && transformedSubCategory && transformedSubCategory.title === "subCategoryLegendItem") {
  64. return [...accumulator, {
  65. vis: parseInt(transformedSubCategory.number)-1,
  66. txt: value,
  67. }];
  68. }
  69. return accumulator;
  70. }, []).sort((a,b) => a.vis - b.vis),
  71. countries: _(source).map((d) => [
  72. d.countryCode, {
  73. vis: parseInt(d[`${baseKey}VIS`]),
  74. txt: d[`${baseKey}TXT`],
  75. }
  76. ]).filter(d => d[1].vis).fromPairs().value(),
  77. }
  78. };
  79.  
  80. Promise.all([
  81. fromCSV(fs.readFileSync(files.source)),
  82. fromCSV(fs.readFileSync(files.meta)),
  83. ])
  84. .then(([source, meta]) => meta.map(transformMetadata(source)))
  85. .then((result) => {
  86. console.log(JSON.stringify(result, null, " "));
  87. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement