diff --git a/package.json b/package.json index 1f693c27..a1e0a18c 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "socket.io-client": "^4.7.5", "tesseract.js": "^5.1.1", "thai-baht-text": "^2.0.5", + "udsv": "^0.6.0", "uuid": "^10.0.0", "vue": "^3.4.38", "vue-i18n": "^9.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e6f96da..915252f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: thai-baht-text: specifier: ^2.0.5 version: 2.0.5 + udsv: + specifier: ^0.6.0 + version: 0.6.0 uuid: specifier: ^10.0.0 version: 10.0.0 @@ -3395,6 +3398,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + udsv@0.6.0: + resolution: {integrity: sha512-na+0EoqqpDeNKZ0HVTtgYtFP9aQgsMwPM77UEK7g4OX2C42w+Qw7QZs9t1ocDGLidtcKJnsPy+o5XrBYaZfzCA==} + ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} @@ -7345,6 +7351,8 @@ snapshots: typescript@5.5.4: {} + udsv@0.6.0: {} + ufo@1.5.3: {} undici-types@6.19.8: {} diff --git a/src/utils/file.ts b/src/utils/file.ts index 0bd86bc0..17f0d6b7 100644 --- a/src/utils/file.ts +++ b/src/utils/file.ts @@ -1,3 +1,4 @@ +import { inferSchema, initParser } from 'udsv'; export function fileToBase64(file: File) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -6,3 +7,22 @@ export function fileToBase64(file: File) { reader.readAsDataURL(file); }); } + +export async function csvToData>( + file: File, +): Promise { + const stream = file.stream().pipeThrough(new TextDecoderStream()); + const reader = stream.getReader(); + + const { value, done } = await reader.read(); + + if (value) { + const parser = initParser(inferSchema(value)); + const data = parser.typedObjs(value); + return data; + } + + if (done) return null; + + return null; +}