aboutsummaryrefslogtreecommitdiff
path: root/src/tools/json-to-csv/json-to-csv.service.ts
diff options
context:
space:
mode:
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.ts35
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');
+}