use Org\Mxchange\CoreFramework\Stream\Filesystem\CsvInputStreamer;
// Import SPL stuff
+use \InvalidArgumentException;
use \SplFileInfo;
+use \UnexpectedValueException;
/**
* A CSV file input class for writing CSV files
* column separators will be parsed or they may be interpreted incorrectly.
*
* @param $columnSeparator Character to use separting columns
+ * @param $expectedMatches Expected matches, 0 is default and means flexible
* @return $lineArray An indexed array with the read line
+ * @throws InvalidArgumentException If a parameter is invalid
+ * @throws UnexpectedValueException If the array count is not matching expected count
*/
- public function readCsvFileLine (string $columnSeparator) {
- // Read raw line
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] columnSeparator=%s - CALLED!', __METHOD__, __LINE__, $columnSeparator));
- $data = $this->getPointerInstance()->readLine();
+ public function readCsvFileLine (string $columnSeparator, int $expectedMatches = 0) {
+ // Validate parameter
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] columnSeparator=%s,expectedMatches=%d - CALLED!', __METHOD__, __LINE__, $columnSeparator, $expectedMatches));
+ if (strlen($columnSeparator) === 0) {
+ // No empty column separator
+ throw new InvalidArgumentException('columnSeparator cannot be empty.');
+ } elseif ($expectedMatches < 0) {
+ // Below zero is not valid
+ throw new InvalidArgumentException(sprintf('expectedMatches=%d is below zero', $expectedMatches));
+ }
+
+ // Read raw line and trim anything unwanted away
+ $data = trim($this->getPointerInstance()->readLine());
// Parse data
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] data()=%d', __METHOD__, __LINE__, strlen($data)));
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] data(%d)=%s', __METHOD__, __LINE__, strlen($data), $data));
$lineArray = $this->parseDataToIndexedArray($data, $columnSeparator);
+ // Is the expected count found?
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] expectedMatches=%d,lineArray()=%d', __METHOD__, __LINE__, $expectedMatches, count($lineArray)));
+ if (($expectedMatches > 0) && (count($lineArray) !== $expectedMatches)) {
+ // Invalid line found as strict count matching is requested
+ throw new UnexpectedValueException(sprintf('lineArray()=%d has not expected count %d', count($lineArray), $expectedMatches));
+ }
+
// Return it
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] lineArray()=%d - EXIT!', __METHOD__, __LINE__, count($lineArray)));
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] lineArray()=%d - EXIT!', __METHOD__, __LINE__, count($lineArray)));
return $lineArray;
}