parent
ac1c7a2c7d
commit
139d85d874
12
CHANGELOG.md
12
CHANGELOG.md
|
@ -5,12 +5,20 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Better auto-detection of CSV separators - [#305](https://github.com/PHPOffice/PhpSpreadsheet/issues/305)
|
||||||
|
|
||||||
## [1.0.0] - 2017-12-25
|
## [1.0.0] - 2017-12-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Support to write merged cells in ODS format [#287](https://github.com/PHPOffice/PhpSpreadsheet/issues/287)
|
- Support to write merged cells in ODS format - [#287](https://github.com/PHPOffice/PhpSpreadsheet/issues/287)
|
||||||
- Able to set the `topLeftCell` in freeze panes [#261](https://github.com/PHPOffice/PhpSpreadsheet/pull/261)
|
- Able to set the `topLeftCell` in freeze panes - [#261](https://github.com/PHPOffice/PhpSpreadsheet/pull/261)
|
||||||
- Support `DateTimeImmutable` as cell value
|
- Support `DateTimeImmutable` as cell value
|
||||||
- Support migration of prefixed classes
|
- Support migration of prefixed classes
|
||||||
|
|
||||||
|
|
|
@ -155,6 +155,10 @@ class Csv extends BaseReader
|
||||||
// Count how many times each of the potential delimiters appears in each line
|
// Count how many times each of the potential delimiters appears in each line
|
||||||
$numberLines = 0;
|
$numberLines = 0;
|
||||||
while (($line = fgets($this->fileHandle)) !== false && (++$numberLines < 1000)) {
|
while (($line = fgets($this->fileHandle)) !== false && (++$numberLines < 1000)) {
|
||||||
|
// Drop everything that is enclosed to avoid counting false positives in enclosures
|
||||||
|
$enclosure = preg_quote($this->enclosure, '/');
|
||||||
|
$line = preg_replace('/(' . $enclosure . '.*' . $enclosure . ')/U', '', $line);
|
||||||
|
|
||||||
$countLine = [];
|
$countLine = [];
|
||||||
for ($i = strlen($line) - 1; $i >= 0; --$i) {
|
for ($i = strlen($line) - 1; $i >= 0; --$i) {
|
||||||
$char = $line[$i];
|
$char = $line[$i];
|
||||||
|
@ -223,6 +227,8 @@ class Csv extends BaseReader
|
||||||
* @param string $pFilename
|
* @param string $pFilename
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function listWorksheetInfo($pFilename)
|
public function listWorksheetInfo($pFilename)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,17 +7,60 @@ use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class CsvTest extends TestCase
|
class CsvTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testDelimiterDetection()
|
/**
|
||||||
|
* @dataProvider providerDelimiterDetection
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @param string $expectedDelimiter
|
||||||
|
* @param string $cell
|
||||||
|
* @param float|int|string $expectedValue
|
||||||
|
*/
|
||||||
|
public function testDelimiterDetection($filename, $expectedDelimiter, $cell, $expectedValue)
|
||||||
{
|
{
|
||||||
$reader = new Csv();
|
$reader = new Csv();
|
||||||
self::assertNull($reader->getDelimiter());
|
self::assertNull($reader->getDelimiter());
|
||||||
|
|
||||||
$filename = __DIR__ . '/../../data/Reader/CSV/semicolon_separated.csv';
|
|
||||||
$spreadsheet = $reader->load($filename);
|
$spreadsheet = $reader->load($filename);
|
||||||
|
|
||||||
self::assertSame(';', $reader->getDelimiter(), 'should be able to infer the delimiter');
|
self::assertSame($expectedDelimiter, $reader->getDelimiter(), 'should be able to infer the delimiter');
|
||||||
|
|
||||||
$actual = $spreadsheet->getActiveSheet()->getCell('C2')->getValue();
|
$actual = $spreadsheet->getActiveSheet()->getCell($cell)->getValue();
|
||||||
self::assertSame('25,5', $actual, 'should be able to retrieve values with commas');
|
self::assertSame($expectedValue, $actual, 'should be able to retrieve correct value');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerDelimiterDetection()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
__DIR__ . '/../../data/Reader/CSV/enclosure.csv',
|
||||||
|
',',
|
||||||
|
'C4',
|
||||||
|
'username2',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
__DIR__ . '/../../data/Reader/CSV/semicolon_separated.csv',
|
||||||
|
';',
|
||||||
|
'C2',
|
||||||
|
'25,5',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
__DIR__ . '/../../data/Reader/HTML/csv_with_angle_bracket.csv',
|
||||||
|
',',
|
||||||
|
'B1',
|
||||||
|
'Number of items with weight <= 50kg',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
__DIR__ . '/../../../samples/Reader/sampleData/example1.csv',
|
||||||
|
',',
|
||||||
|
'I4',
|
||||||
|
'100%',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
__DIR__ . '/../../../samples/Reader/sampleData/example2.csv',
|
||||||
|
',',
|
||||||
|
'D8',
|
||||||
|
-58.373161,
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
"Date/Time","task","username"
|
||||||
|
"12/17/2017 14:35","viewpage","username1",
|
||||||
|
"12/17/2017 04:00","editpage","username5",
|
||||||
|
"11/29/2017 08:20","deletepage","username2",,
|
Can't render this file because it has a wrong number of fields in line 2.
|
Loading…
Reference in New Issue