/** * Parses a csv file into a DataTable. * * Pass in a filepath to a csv file and an array of column types: * ['date', 'number', 'number', 'number'] for example and a DataTable * will be built. * * @access public * @since 1.0.0 * @param string $filepath Path location to a csv file * @param array $columnTypes Array of column types to apply to the csv values * @throws \Khill\Lavacharts\Exceptions\InvalidFunctionParam * @return \Khill\Lavacharts\DataTable */ public function parseCsvFile($filepath, $columnTypes = null) { if (Utils::nonEmptyString($filepath) === false) { throw new InvalidFunctionParam($filepath, __FUNCTION__, 'string'); } $this->addNewColumns($columnTypes); $this->setReader(Reader::createFromPath($filepath)); $this->reader->setFlags(\SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY); $csvColumns = $this->reader->fetchOne(); foreach ($this->newColumns as $index => $column) { if (in_array($column, $this->columnTypes, true) === false) { throw new InvalidColumnType($column, Utils::arrayToPipedString($this->columnTypes)); } $this->addColumnFromStrings($columnTypes[$index], $csvColumns[$index]); } $csvRows = $this->reader->setOffset(1)->fetchAll(function ($row) { return array_map(function ($cell) { if (is_numeric($cell)) { return $cell + 0; } else { return $cell; } }, $row); }); return $this->addRows($csvRows); }
/** * Set the metadata from a file. * * @param string $file */ public function setDefaultsFromFile($file) { $file = new Reader($file); // Fetch columns $rows = $file->fetchOne(); $file->setOffset(1); // Fetch entries and set defaults $entries = $file->fetchAssoc($rows); foreach ($entries as $entry) { if (strpos(URL::current(), $entry['url']) !== false) { $this->defaults = $entry; } } }