diff options
author | Ignace Nyamagana Butera <nyamsprod@gmail.com> | 2014-05-22 17:06:31 +0200 |
---|---|---|
committer | Ignace Nyamagana Butera <nyamsprod@gmail.com> | 2014-05-22 17:06:31 +0200 |
commit | c5240b896c70235f1f2a730a0e45b627014e2ef8 (patch) | |
tree | 028996f8f0369c531091a75867448cf8363f9a58 /src | |
parent | b2a1532d7fa470fa6951ee2baf30bcfe0c1a8a3b (diff) | |
download | csv-c5240b896c70235f1f2a730a0e45b627014e2ef8.zip csv-c5240b896c70235f1f2a730a0e45b627014e2ef8.tar.gz csv-c5240b896c70235f1f2a730a0e45b627014e2ef8.tar.bz2 |
AbstractCsv::detectDelimiter improved
Diffstat (limited to 'src')
-rw-r--r-- | src/AbstractCsv.php | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/AbstractCsv.php b/src/AbstractCsv.php index af77e5a..6c59aae 100644 --- a/src/AbstractCsv.php +++ b/src/AbstractCsv.php @@ -155,12 +155,34 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate } /** + * detect the actual number of row according to a delimiter + * + * @param string $delimiter a CSV delimiter + * @param integer $nb_rows the number of row to consider + * + * @return integer + */ + protected function fetchRowsCountByDelimiter($delimiter, $nb_rows = 1) + { + $iterator = $this->getIterator(); + $iterator->setCsvControl($delimiter, $this->enclosure, $this->escape); + //"reduce" the csv length to a maximum of $nb_rows + $iterator = new LimitIterator($iterator, 0, $nb_rows); + //return the parse rows + $iterator = new CallbackFilterIterator($iterator, function ($row) { + return is_array($row) && count($row) > 1; + }); + + return count(iterator_to_array($iterator, false)); + } + + /** * Detect the CSV file delimiter * * @param integer $nb_rows * @param array $delimiters additional delimiters * - * @return string + * @return null|string * * @throws \InvalidArgumentException If $nb_rows value is invalid * @throws \RuntimeException If too many delimiters are found @@ -180,19 +202,10 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate $delimiters = array_unique($delimiters); //detect the possible delimiter - $res = []; - foreach ($delimiters as $delim) { - $iterator = $this->getIterator(); - $iterator->setCsvControl($delim, $this->enclosure, $this->escape); - //"reduce" the csv length to a maximum of $nb_rows - $iterator = new CallbackFilterIterator( - new LimitIterator($iterator, 0, $nb_rows), - function ($row) { - return is_array($row) && count($row) > 1; - } - ); - $res[$delim] = count(iterator_to_array($iterator, false)); - } + $res = array_fill_keys($delimiters, 0); + array_walk($res, function (&$value, $delim) use ($nb_rows) { + $value = $this->fetchRowsCountByDelimiter($delim, $nb_rows); + }); arsort($res, SORT_NUMERIC); $res = array_keys(array_filter($res)); |