diff --git a/typo3/sysext/core/Classes/Utility/CsvUtility.php b/typo3/sysext/core/Classes/Utility/CsvUtility.php index a744c056e12dee30c82eede3e2c78b617ae7f6ef..fcf5a99fddca0bcd4282a12b05ee76315c7eb9c1 100644 --- a/typo3/sysext/core/Classes/Utility/CsvUtility.php +++ b/typo3/sysext/core/Classes/Utility/CsvUtility.php @@ -22,26 +22,26 @@ class CsvUtility { /** * Convert a string, formatted as CSV, into an multidimensional array * + * This cannot be done by str_getcsv, since it's impossible to handle enclosed cells with a line feed in it + * * @param string $input The CSV input * @param string $fieldDelimiter The field delimiter * @param string $fieldEnclosure The field enclosure - * @param string $rowDelimiter The row delimiter * @param int $maximumColumns The maximum amount of columns * @return array */ - static public function csvToArray($input, $fieldDelimiter = ',', $fieldEnclosure = '"', $rowDelimiter = LF, $maximumColumns = 0) { + static public function csvToArray($input, $fieldDelimiter = ',', $fieldEnclosure = '"', $maximumColumns = 0) { $multiArray = array(); $maximumCellCount = 0; - // explode() would not work with enclosed newlines - $rows = str_getcsv($input, $rowDelimiter); - - foreach ($rows as $row) { - $cells = str_getcsv($row, $fieldDelimiter, $fieldEnclosure); - - $maximumCellCount = max(count($cells), $maximumCellCount); - - $multiArray[] = $cells; + if (($handle = fopen('php://memory', 'r+')) !== FALSE) { + fwrite($handle, $input); + rewind($handle); + while (($cells = fgetcsv($handle, 0, $fieldDelimiter, $fieldEnclosure)) !== FALSE) { + $maximumCellCount = max(count($cells), $maximumCellCount); + $multiArray[] = $cells; + } + fclose($handle); } if ($maximumColumns > $maximumCellCount) { @@ -66,4 +66,4 @@ class CsvUtility { return $multiArray; } -} \ No newline at end of file +} diff --git a/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php index 094e7c378abda9e4dd01ed7b426381b3c7d1cff9..9ef3b4ef8b45a74c6902bb6f6e76458c252042be 100644 --- a/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php +++ b/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php @@ -29,8 +29,7 @@ class CsvUtilityTest extends UnitTestCase { 'Valid data' => array( 'input' => 'Column A, Column B, Column C' . LF . 'Value, Value2, Value 3', 'fieldDelimiter' => ',', - 'fieldEnclosure' => '', - 'rowDelimiter' => LF, + 'fieldEnclosure' => '"', 'maximumColumns' => 0, 'expectedResult' => array( array('Column A', ' Column B', ' Column C'), @@ -42,7 +41,6 @@ class CsvUtilityTest extends UnitTestCase { 'input' => '"Column A", "Column B", "Column C"' . LF . '"Value", "Value2", "Value 3"', 'fieldDelimiter' => ',', 'fieldEnclosure' => '"', - 'rowDelimiter' => LF, 'maximumColumns' => 0, 'expectedResult' => array( array('Column A', 'Column B', 'Column C'), @@ -54,7 +52,6 @@ class CsvUtilityTest extends UnitTestCase { 'input' => '"Column A"; "Column B"; "Column C"' . LF . '"Value"; "Value2"; "Value 3"', 'fieldDelimiter' => ';', 'fieldEnclosure' => '"', - 'rowDelimiter' => LF, 'maximumColumns' => 0, 'expectedResult' => array( array('Column A', 'Column B', 'Column C'), @@ -66,7 +63,6 @@ class CsvUtilityTest extends UnitTestCase { 'input' => '"Column A"; "Column B"; "Column C"; "Column D"' . LF . '"Value"; "Value2"; "Value 3"', 'fieldDelimiter' => ';', 'fieldEnclosure' => '"', - 'rowDelimiter' => LF, 'maximumColumns' => 2, 'expectedResult' => array( array('Column A', 'Column B'), @@ -78,24 +74,11 @@ class CsvUtilityTest extends UnitTestCase { 'input' => '"Column A", "Column B", "Column C"' . LF . '"Value", "Value2", "Value 3"', 'fieldDelimiter' => ';', 'fieldEnclosure' => '"', - 'rowDelimiter' => LF, 'maximumColumns' => 0, 'expectedResult' => array( array('Column A, "Column B", "Column C"'), array('Value, "Value2", "Value 3"') ) - ), - - 'Data with comma as field delimiter and semicolons as row delimiter' => array( - 'input' => '"Column A", "Column B", "Column C";"Value", "Value2", "Value 3"', - 'fieldDelimiter' => ',', - 'fieldEnclosure' => '"', - 'rowDelimiter' => ';', - 'maximumColumns' => 0, - 'expectedResult' => array( - array('Column A', 'Column B', 'Column C'), - array('Value', 'Value2', 'Value 3') - ) ) ); } @@ -104,7 +87,7 @@ class CsvUtilityTest extends UnitTestCase { * @dataProvider csvToArrayDataProvider * @test */ - public function csvToArraySplitsAsExpected($input, $fieldDelimiter, $fieldEnclosure, $rowDelimiter, $maximumColumns, $expectedResult) { - $this->assertEquals($expectedResult, CsvUtility::csvToArray($input, $fieldDelimiter, $fieldEnclosure, $rowDelimiter, $maximumColumns)); + public function csvToArraySplitsAsExpected($input, $fieldDelimiter, $fieldEnclosure, $maximumColumns, $expectedResult) { + $this->assertEquals($expectedResult, CsvUtility::csvToArray($input, $fieldDelimiter, $fieldEnclosure, $maximumColumns)); } } \ No newline at end of file diff --git a/typo3/sysext/frontend/Classes/DataProcessing/CommaSeparatedValueProcessor.php b/typo3/sysext/frontend/Classes/DataProcessing/CommaSeparatedValueProcessor.php index 3fe236e6840e3936b6b8718d423339044446510d..ebdaaf3f9873f333cbf7198040b4491e3aee507f 100644 --- a/typo3/sysext/frontend/Classes/DataProcessing/CommaSeparatedValueProcessor.php +++ b/typo3/sysext/frontend/Classes/DataProcessing/CommaSeparatedValueProcessor.php @@ -91,14 +91,10 @@ class CommaSeparatedValueProcessor implements DataProcessorInterface { // Set the field enclosure which is " by default $fieldEnclosure = $cObj->stdWrapValue('fieldEnclosure', $processorConfiguration, '"'); - // Set the row delimiter which is "LF" by default - $rowDelimiter = $cObj->stdWrapValue('rowDelimiter', $processorConfiguration, LF); - $processedData[$targetVariableName] = CsvUtility::csvToArray( $originalValue, $fieldDelimiter, $fieldEnclosure, - $rowDelimiter, (int)$maximumColumns );