I just updated from 7.0.1 to 7.1.0 and noticed that my internal tests failed due to a null value appended at the end of each CSV file that was imported. After some trial and error I figured that the SplFileObject falgs don't seem to have an effect any longer.
I'm missing the SplFileObject::SKIP_EMPTY flag in particular since it seemed to make sure that there's no null value at the end if the file terminates on a new line.
See the following test script:
<?php
use League\Csv\Reader;
include __DIR__."/vendor/autoload.php";
$path = __DIR__."/tmp.txt";
$str = "1st\n2nd\n";
$obj = new SplFileObject($path,"w+");
$obj->fwrite($str);
$obj = new SplFileObject($path,"r");
$reader = Reader::createFromFileObject($obj);
$flags = [
"NONE" => 0,
"READ_AHEAD" => SplFileObject::READ_AHEAD,
"READ_AHEAD | DROP_NEW_LINE" => SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE,
"READ_AHEAD | SKIP_EMPTY" => SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY,
"READ_AHEAD | DROP_NEW_LINE | SKIP_EMPTY" => SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY,
"DROP_NEW_LINE" => SplFileObject::DROP_NEW_LINE ,
"DROP_NEW_LINE | SKIP_EMPTY" => SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY,
"SKIP_EMPTY" => SplFileObject::SKIP_EMPTY ,
];
foreach($flags as $flagName => $flag) {
$reader->setFlags($flag);
$lines = $reader->fetchAll();
$vals = [];
foreach($lines as $line){
if($line == null){
$vals[] = "<null>";
}elseif(count($line)){
$val = array_shift($line);
if($val == null){
$val = "<null>";
}
$vals[] = $val;
}
}
echo count($lines). " lines [".implode(', ',$vals)."]\tfor ". $flagName."\n";
}
Output in 7.0.1
3 lines [1st, 2nd, <null>] for NONE
3 lines [1st, 2nd, <null>] for READ_AHEAD
3 lines [1st, 2nd, <null>] for READ_AHEAD | DROP_NEW_LINE
2 lines [1st, 2nd] for READ_AHEAD | SKIP_EMPTY
2 lines [1st, 2nd] for READ_AHEAD | DROP_NEW_LINE | SKIP_EMPTY
3 lines [1st, 2nd, <null>] for DROP_NEW_LINE
2 lines [1st, 2nd] for DROP_NEW_LINE | SKIP_EMPTY
2 lines [1st, 2nd] for SKIP_EMPTY
Please note the lines with SplFileObject::SKIP_EMPTY set: Those contain only 2 values (as expected).
Output in 7.1.0
3 lines [1st, 2nd, <null>] for NONE
3 lines [1st, 2nd, <null>] for READ_AHEAD
3 lines [1st, 2nd, <null>] for READ_AHEAD | DROP_NEW_LINE
3 lines [1st, 2nd, <null>] for READ_AHEAD | SKIP_EMPTY
3 lines [1st, 2nd, <null>] for READ_AHEAD | DROP_NEW_LINE | SKIP_EMPTY
3 lines [1st, 2nd, <null>] for DROP_NEW_LINE
3 lines [1st, 2nd, <null>] for DROP_NEW_LINE | SKIP_EMPTY
3 lines [1st, 2nd, <null>] for SKIP_EMPTY
Regardless of the flags, the output is always the same (3 lines, last one is null. I tried to figure out what was changed between those version but was unable to identify the cause - so this is my last desperate attempt to understand what's going on :)
I just updated from 7.0.1 to 7.1.0 and noticed that my internal tests failed due to a
nullvalue appended at the end of each CSV file that was imported. After some trial and error I figured that theSplFileObjectfalgs don't seem to have an effect any longer.I'm missing the
SplFileObject::SKIP_EMPTYflag in particular since it seemed to make sure that there's nonullvalue at the end if the file terminates on a new line.See the following test script:
Output in 7.0.1
Please note the lines with
SplFileObject::SKIP_EMPTYset: Those contain only 2 values (as expected).Output in 7.1.0
Regardless of the flags, the output is always the same (3 lines, last one is
null. I tried to figure out what was changed between those version but was unable to identify the cause - so this is my last desperate attempt to understand what's going on :)