aboutsummaryrefslogtreecommitdiff
path: root/src_js/csv.ts
diff options
context:
space:
mode:
authorbozo.kopic <bozo@kopic.xyz>2022-11-13 03:39:02 +0100
committerbozo.kopic <bozo@kopic.xyz>2022-11-13 03:39:02 +0100
commitb30a00a9713fd52865129132317beb6fa875017c (patch)
treec367859b2cfaf820c88eb4822e566d06144ecd4b /src_js/csv.ts
parent26b2dee4ef3f0a00bd6fb2989ada48ad9b054972 (diff)
type script
Diffstat (limited to 'src_js/csv.ts')
-rw-r--r--src_js/csv.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/src_js/csv.ts b/src_js/csv.ts
new file mode 100644
index 0000000..8ab4f51
--- /dev/null
+++ b/src_js/csv.ts
@@ -0,0 +1,36 @@
+// @ts-ignore
+import Papa from 'papaparse';
+
+
+export async function decode<TKey extends string>(
+ blob: Blob,
+ header: Record<TKey, (val: string) => any>
+): Promise<Record<TKey, any>[]> {
+ const data = await new Promise(resolve => {
+ Papa.parse(blob, {
+ header: true,
+ complete: (result: any) => resolve(result.data)
+ });
+ }) as Record<string, string>[];
+
+ const result: Record<TKey, any>[] = [];
+ for (const i of data) {
+ let element = {} as Record<TKey, any> | null;
+ for (const [k, v] of Object.entries(header)) {
+ if (!(k in i)) {
+ element = null;
+ break;
+ }
+ (element as any)[k] = (v as any)(i[k]);
+ }
+ if (element)
+ result.push(element);
+ }
+ return result;
+}
+
+
+export function encode(data: Record<string, any>[]): Blob {
+ const csvData = Papa.unparse(data);
+ return new Blob([csvData], {type: 'text/csv'});
+}