summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIgnace Nyamagana Butera <nyamsprod@gmail.com>2014-05-22 17:06:31 +0200
committerIgnace Nyamagana Butera <nyamsprod@gmail.com>2014-05-22 17:06:31 +0200
commitc5240b896c70235f1f2a730a0e45b627014e2ef8 (patch)
tree028996f8f0369c531091a75867448cf8363f9a58 /src
parentb2a1532d7fa470fa6951ee2baf30bcfe0c1a8a3b (diff)
downloadcsv-c5240b896c70235f1f2a730a0e45b627014e2ef8.zip
csv-c5240b896c70235f1f2a730a0e45b627014e2ef8.tar.gz
csv-c5240b896c70235f1f2a730a0e45b627014e2ef8.tar.bz2
AbstractCsv::detectDelimiter improved
Diffstat (limited to 'src')
-rw-r--r--src/AbstractCsv.php41
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));