Getting a value from within FileReader.onloadend (extracting first line of a csv without reading the whole file)

Viewed 9

I'm trying to extract the first line (headers) from a CSV using TypeScript. I found a nifty function that does this using FileReader.onloadend, iterating over the bytes in the file until it reaches a line break. This function assigns the the header string to a window namespace. This is unfortunately not that useful to me in a window namespace, but I can't find a workable way of getting the header string assigned to a global variable. Does anyone know how best to do this? Is this achievable with this function?

The function is here:

declare global {
    interface Window { MyNamespace: any; }
}

export const CSVImportGetHeaders = async (file: File) => {
    const reader = new FileReader();
    reader.readAsArrayBuffer(file);
    // onload triggered each time the reading operation is completed
    reader.onloadend = (evt: any) => {
        // get array buffer
        const data = evt.target.result;
        console.log('reader content ', reader);
        // get byte length
        const byteLength = data.byteLength;
        console.log('HEADER STRING ', byteLength);
        // make iterable array
        const ui8a = new Uint8Array(data, 0);
        // header string, compiled iterably
        let headerString = '';
        let finalIndex = 0;
        // eslint-disable-next-line no-plusplus
        for (let i = 0; i < byteLength; i++) {
            // get current character
            const char = String.fromCharCode(ui8a[i]);
            // check if new line
            if (char.match(/[^\r\n]+/g) !== null) {
                // if not a new line, continue
                headerString += char;
            } else {
                // if new lineBreak, stop
                finalIndex = i;
                break;
            }
        }
        window.MyNamespace = headerString.split(/,|;/);
        const potout = window.MyNamespace;
        console.log('reader result in function', potout);
    };
    const output = await window.MyNamespace;
    console.log('outside onload event', output);
};
0 Answers
Related