diff options
author | 2023-06-18 17:57:18 +0200 | |
---|---|---|
committer | 2023-06-18 18:10:06 +0200 | |
commit | 69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c (patch) | |
tree | 27d2b1fde22872f3d21dedf7c9af99f42187945b /src/tools/json-to-csv/json-to-csv.service.ts | |
parent | 4cbd7ac14588e954510340186c6797b19caca593 (diff) | |
download | it-tools-69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c.tar.gz it-tools-69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c.tar.zst it-tools-69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c.zip |
feat(new-tool): json to csv converter
Diffstat (limited to 'src/tools/json-to-csv/json-to-csv.service.ts')
-rw-r--r-- | src/tools/json-to-csv/json-to-csv.service.ts | 35 |
1 files changed, 35 insertions, 0 deletions
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, unknown>[] }): string[] { + const headers = new Set<string>(); + + 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, unknown>[] }): string { + const headers = getHeaders({ array }); + + const rows = array.map(item => headers.map(header => serializeValue(item[header]))); + + return [headers.join(','), ...rows].join('\n'); +} |