]> git.mxchange.org Git - core.git/blobdiff - framework/main/classes/file_directories/text/input/csv/class_CsvInputFile.php
Continued:
[core.git] / framework / main / classes / file_directories / text / input / csv / class_CsvInputFile.php
index 51c04439c437570d3d0a97566f734f7356e9ee8d..c34a6d18fba5398425ca3e7d96f78659c341d8e7 100644 (file)
@@ -4,17 +4,20 @@ namespace Org\Mxchange\CoreFramework\Filesystem\Input\Csv;
 
 // Import framework stuff
 use Org\Mxchange\CoreFramework\Filesystem\Text\BaseInputTextFile;
+use Org\Mxchange\CoreFramework\Generic\FrameworkInterface;
 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
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2021 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
@@ -65,19 +68,45 @@ 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('Parameter "columnSeparator" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } 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());
+
+               // Is the line empty?
+               /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] data(%d)=%s', __METHOD__, __LINE__, strlen($data), $data));
+               if (empty($data)) {
+                       // Yes, then skip below code
+                       /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Read data is an empty line - EXIT!', __METHOD__, __LINE__));
+                       return;
+               }
 
                // Parse data
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] data()=%d', __METHOD__, __LINE__, strlen($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), FrameworkInterface::EXCEPTION_UNEXPECTED_VALUE);
+               }
+
                // 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;
        }