From 4ef0c4f57db6a058bf372438c4dad0701ab79f90 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Mon, 24 Jan 2022 01:49:38 +0300 Subject: [PATCH] Create csv.js --- scripts/core/csv.js | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 scripts/core/csv.js diff --git a/scripts/core/csv.js b/scripts/core/csv.js new file mode 100644 index 0000000..3b76824 --- /dev/null +++ b/scripts/core/csv.js @@ -0,0 +1,62 @@ +const csv2json = require('csvtojson') +const fs = require('mz/fs') +const { + Parser, + transforms: { flatten }, + formatters: { stringQuoteOnlyIfNecessary } +} = require('json2csv') + +const csv2jsonOptions = { + checkColumn: true, + trim: true, + colParser: { + countries: listParser, + languages: listParser, + categories: listParser, + broadcast_area: listParser, + is_nsfw: boolParser, + logo: nullable + } +} + +const json2csv = new Parser({ + transforms: [flattenArray], + formatters: { + string: stringQuoteOnlyIfNecessary() + } +}) + +const csv = {} + +csv.load = async function (filepath) { + return csv2json(csv2jsonOptions).fromFile(filepath) +} + +csv.save = async function (filepath, data) { + const string = json2csv.parse(data) + + return fs.writeFile(filepath, string) +} + +module.exports = csv + +function flattenArray(item) { + for (let prop in item) { + const value = item[prop] + item[prop] = Array.isArray(value) ? value.join(';') : value + } + + return item +} + +function listParser(value) { + return value.split(';').filter(i => i) +} + +function boolParser(value) { + return value === 'true' +} + +function nullable(value) { + return value === '' ? null : value +}