Source: data/CsvLoader.js

import { DataFrame } from "./DataFrame.js";
import { DataLoader } from "./DataLoader.js";

/**
 * A loader for csv data or files supporting different delimiters.
 * 
 * Warning: does not support quotes.
 * 
 * @author rkoppe <roland.koppe@awi.de>
 */
export class CsvLoader extends DataLoader {

    content = null;
    dataFrame = null;

    constructor(content, separator = '\t') {
        super();
        this.content = content;
        this.separator = separator;
    }

    /**
     * Returns a list of available parameters, columns, data streams as Promise.
     * 
     * @return {Promise<String[]>}
     */
    async parameters() {
        if (this.dataFrame == null) this.dataFrame = await this._read(this.content);
        return Object.keys(that.dataFrame.columnMap);
    }

    /**
     * Returns a DataFrame of the content as Promise.
     * 
     * FIXME: support generic but compiled? filters, remove defined attributes
     * 
     * @return {Promise<DataFrame>} Promise<DataFrame>
     */
    async data() {
        if (this.dataFrame == null) this.dataFrame = await this._read(this.content);
        return this.dataFrame;
    }

    /**
     * Reads the given string or File content and returns a Promise for listening
     * to the resolve event.
     * 
     * @param {string|File} content 
     */
    _read(content) {
        let that = this;

        // load from file
        if (content instanceof File) {
            return new Promise(function (resolve) {
                let fr = new FileReader();
                fr.onload = function (event) {
                    resolve(that._read(event.target.result));
                }
                fr.readAsText(content);
            });

        } else {
            return new Promise(function (resolve) {
                let df = new DataFrame();
                df.read(content, that.separator);
                resolve(df);
            });
        }
    }
}