Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 4x 4x 4x 4x 4x 1x 1x 4x 4x 4x 4x 4x 1x 1x 4x 4x 4x 4x 4x 4x 5x 2x 2x 5x 1x 1x 2x 2x 2x 5x 4x 4x 4x 4x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 4x 1x 1x 4x 1x 1x 1x 4x 4x | // src/CSVDoc.js import fs from 'node:fs'; import { Aggregation } from './Aggregation.js'; /** * This class is responsible for reading a CSV file, * processing its content, and providing methods to access its data. * It reads the file, processes the CSV content, and provides methods to get * the file path, file content, column names, and perform aggregations on * specific columns. */ export class CSVDoc { // Instance variables filePath; file; fileColumn; fileData; separator; /** * Setup the CSVDoc instance with the file path. * methods to access its data. It reads the file, processes the CSV content, * and provides methods to get the file path, file content, column names, * and perform aggregations on specific columns. * @param {string} filePath The absolute path to the csv file * @param {string} [separator] The separator of the CSV */ constructor(filePath, separator = ',') { this.#checkValid(filePath); this.filePath = filePath; this.file = fs.readFileSync(filePath); this.separator = separator; this.#processCSV(); } /** * Get the path of the file * @returns {string} The string of the absolute file path */ getFilePath() { return this.filePath; } /** * Get the fs object of the file * @returns {object} The fs.readFileSync() object of the file */ getFile() { return this.file; } /** * Get the column name of the csv that is imported * @returns {Array} An array of column names */ getColumns() { return this.fileColumn; } /** * Get the aggregation data for the given column. * @param {string} name The name of the column * @returns {Aggregation} Returns the aggregation class for the column */ aggregateColumn(name) { if (!name || typeof name !== 'string') { throw new TypeError('Column name must be a non-empty string.'); } if (!this.fileColumn.includes(name)) { throw new Error(`Column "${name}" does not exist in the CSV file.`); } const index = this.fileColumn.indexOf(name); const column = this.fileData.map((value) => value[index]); return new Aggregation(column); } /** * Process the csv */ #processCSV() { let content = this.file.toString('utf-8').split('\n'); content = content.map((content) => content.split(this.separator)); this.fileColumn = content.shift(); this.fileData = content; } /** * Checks if the filepath is valid and if the file exists at the given path. * @param {string} filePath The absolute path to the file to check. * @throws {TypeError} If filePath is not provided. * @throws {Error} If the file does not exist at the provided path. * @returns {boolean} True if the file is in the right format, otherwise throws an error. */ #checkValid(filePath) { if (!filePath || '' == filePath || undefined == filePath) { throw new TypeError('filePath must be provided.'); } if (!fs.existsSync(filePath)) { throw new Error('File does not exist at the provided path: ' + filePath); } if (!filePath.toUpperCase().endsWith('.CSV')) { throw new TypeError('File is not a CSV file: ' + filePath); } return true; } } |