Allow CSV escape character to be set

Fixes #492
Closes #510
This commit is contained in:
Robin D'Arcy 2018-05-23 02:31:41 +01:00 committed by Adrien Crivelli
parent 0c7df7721b
commit c723833d6f
4 changed files with 51 additions and 2 deletions

View File

@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Support to read Xlsm templates with form elements, macros, printer settings, protected elements and back compatibility drawing, and save result without losing important elements of document - [#435](https://github.com/PHPOffice/PhpSpreadsheet/issues/435)
- Expose sheet title maximum length as `Worksheet::SHEET_TITLE_MAXIMUM_LENGTH` - [#482](https://github.com/PHPOffice/PhpSpreadsheet/issues/482)
- Allow escape character to be set in CSV reader [#492](https://github.com/PHPOffice/PhpSpreadsheet/issues/492)
### Fixed

View File

@ -50,6 +50,13 @@ class Csv extends BaseReader
*/
private $contiguousRow = -1;
/**
* The character that can escape the enclosure.
*
* @var string
*/
private $escapeCharacter = '\\';
/**
* Create a new CSV Reader instance.
*/
@ -254,7 +261,7 @@ class Csv extends BaseReader
$worksheetInfo[0]['totalColumns'] = 0;
// Loop through each line of the file in turn
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) {
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure, $this->escapeCharacter)) !== false) {
++$worksheetInfo[0]['totalRows'];
$worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1);
}
@ -326,7 +333,7 @@ class Csv extends BaseReader
}
// Loop through each line of the file in turn
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) {
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure, $this->escapeCharacter)) !== false) {
$columnLetter = 'A';
foreach ($rowData as $rowDatum) {
if ($rowDatum != '' && $this->readFilter->readCell($columnLetter, $currentRow)) {
@ -458,6 +465,30 @@ class Csv extends BaseReader
return $this->contiguous;
}
/**
* Set escape backslashes.
*
* @param string $escapeCharacter
*
* @return $this
*/
public function setEscapeCharacter($escapeCharacter)
{
$this->escapeCharacter = $escapeCharacter;
return $this;
}
/**
* Get escape backslashes.
*
* @return string
*/
public function getEscapeCharacter()
{
return $this->escapeCharacter;
}
/**
* Can the current IReader read the file?
*

View File

@ -89,4 +89,19 @@ class CsvTest extends TestCase
[true, '../samples/Reader/sampleData/example2.csv'],
];
}
public function testEscapeCharacters()
{
$reader = (new Csv())->setEscapeCharacter('"');
$worksheet = $reader->load(__DIR__ . '/../../data/Reader/CSV/backslash.csv')
->getActiveSheet();
$expected = [
['field 1', 'field 2\\'],
['field 3\\', 'field 4'],
];
$this->assertSame('"', $reader->getEscapeCharacter());
$this->assertSame($expected, $worksheet->toArray());
}
}

View File

@ -0,0 +1,2 @@
"field 1","field 2\"
"field 3\","field 4"
1 field 1 field 2\
2 field 3\ field 4