From 69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c Mon Sep 17 00:00:00 2001 From: Corentin Thomasset Date: Sun, 18 Jun 2023 17:57:18 +0200 Subject: feat(new-tool): json to csv converter --- src/tools/json-to-csv/json-to-csv.service.ts | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/tools/json-to-csv/json-to-csv.service.ts (limited to 'src/tools/json-to-csv/json-to-csv.service.ts') diff --git a/src/tools/json-to-csv/json-to-csv.service.ts b/src/tools/json-to-csv/json-to-csv.service.ts new file mode 100644 index 0000000..ab3c04e --- /dev/null +++ b/src/tools/json-to-csv/json-to-csv.service.ts @@ -0,0 +1,35 @@ +export { getHeaders, convertArrayToCsv }; + +function getHeaders({ array }: { array: Record[] }): string[] { + const headers = new Set(); + + array.forEach(item => Object.keys(item).forEach(key => headers.add(key))); + + return Array.from(headers); +} + +function serializeValue(value: unknown): string { + if (value === null) { + return 'null'; + } + + if (value === undefined) { + return ''; + } + + const valueAsString = String(value).replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/"/g, '\\"'); + + if (valueAsString.includes(',')) { + return `"${valueAsString}"`; + } + + return valueAsString; +} + +function convertArrayToCsv({ array }: { array: Record[] }): string { + const headers = getHeaders({ array }); + + const rows = array.map(item => headers.map(header => serializeValue(item[header]))); + + return [headers.join(','), ...rows].join('\n'); +} -- cgit v1.2.3