Skip to content

Commit

Permalink
Improve/patch file parsing for better support of newlines in field va…
Browse files Browse the repository at this point in the history
…lues
  • Loading branch information
nicksagona committed May 22, 2019
1 parent 6ccb5b5 commit 2f8d0b0
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions src/Csv.php
Original file line number Diff line number Diff line change
Expand Up @@ -311,26 +311,30 @@ public static function unserializeString($string, array $options = [])
$data = [];
$fieldKeys = [];

foreach ($lines as $i => $line) {
$line = trim($line);
if (!empty($line)) {
if (($i == 0) && ($fields)) {
$fieldNames = str_getcsv($line, $delimiter, $enclosure, $escape);
foreach ($fieldNames as $name) {
$fieldKeys[] = trim($name);
}
} else {
$values = str_getcsv($line, $delimiter, $enclosure, $escape);
foreach ($values as $key => $value) {
$values[$key] = stripslashes(trim($value));
}
if ((count($fieldKeys) > 0) && (count($fieldKeys) == count($values))) {
$data[] = array_combine($fieldKeys, $values);
} else {
$data[] = $values;
$tempFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'pop-csv-tmp-' . time() . '.csv';
file_put_contents($tempFile, $string);

if ($fields) {
$fieldNames = str_getcsv($lines[0], $delimiter, $enclosure, $escape);
foreach ($fieldNames as $name) {
$fieldKeys[] = trim($name);
}
}

if (($handle = fopen($tempFile, 'r')) !== false) {
while (($dataFields = fgetcsv($handle, 1000, $delimiter, $enclosure, $escape)) !== false) {
if (($fields) && (count($dataFields) == count($fieldKeys)) && ($dataFields != $fieldKeys)) {
$d = [];
foreach ($dataFields as $i => $value) {
$d[$fieldKeys[$i]] = $value;
}
$data[] = $d;
} else if ($dataFields != $fieldKeys) {
$data[] = $dataFields;
}
}
fclose($handle);
unlink($tempFile);
}

return $data;
Expand Down

0 comments on commit 2f8d0b0

Please sign in to comment.