aboutsummaryrefslogtreecommitdiff
path: root/src/tools/json-to-csv/json-to-csv.service.ts
diff options
context:
space:
mode:
authorGravatar Corentin Thomasset <corentin.thomasset74@gmail.com> 2023-06-18 17:57:18 +0200
committerGravatar Corentin Thomasset <corentin.thomasset74@gmail.com> 2023-06-18 18:10:06 +0200
commit69f0bd079fd824dc9e929ccbbaa6bcaab0c38a7c (patch)
tree27d2b1fde22872f3d21dedf7c9af99f42187945b /src/tools/json-to-csv/json-to-csv.service.ts
parent4cbd7ac14588e954510340186c6797b19caca593 (diff)
downloadit-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.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');
+}