From: Roland Häder <roland@mxchange.org>
Date: Thu, 26 Aug 2021 02:11:07 +0000 (+0200)
Subject: Continued:
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=7c7b31032ea193ccc98c64038bff678023bc4619;p=core.git

Continued:
- CsvInputFile->readCsvFileLine() now accepts optional 2nd parameter
  $expectedMatches
- it also may throw 2 different exceptions on you

Signed-off-by: Roland Häder <roland@mxchange.org>
---

diff --git a/framework/main/classes/file_directories/text/input/csv/class_CsvInputFile.php b/framework/main/classes/file_directories/text/input/csv/class_CsvInputFile.php
index 51c04439..b9c5f162 100644
--- a/framework/main/classes/file_directories/text/input/csv/class_CsvInputFile.php
+++ b/framework/main/classes/file_directories/text/input/csv/class_CsvInputFile.php
@@ -7,7 +7,9 @@ use Org\Mxchange\CoreFramework\Filesystem\Text\BaseInputTextFile;
 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
@@ -65,19 +67,38 @@ class CsvInputFile extends BaseInputTextFile implements CsvInputStreamer {
 	 * 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;
 	}
 
diff --git a/framework/main/interfaces/io/file/csv/class_CsvInputStreamer.php b/framework/main/interfaces/io/file/csv/class_CsvInputStreamer.php
index b5be1e38..3f383d65 100644
--- a/framework/main/interfaces/io/file/csv/class_CsvInputStreamer.php
+++ b/framework/main/interfaces/io/file/csv/class_CsvInputStreamer.php
@@ -32,8 +32,10 @@ interface CsvInputStreamer extends FileInputStreamer {
 	 * Reads a line from CSV file and returns it as an indexed array
 	 *
 	 * @param	$columnSeparator	Character to use separting columns
+	 * @param	$expectedMatches	Expected matches, 0 is default and means flexible
 	 * @return	$lineArray			An index array with the read line
+	 * @throws	InvalidArgumentException	If a parameter is invalid
 	 */
-	function readCsvFileLine (string $columnSeparator);
+	function readCsvFileLine (string $columnSeparator, int $expectedMatches = 0);
 
 }