From 98a146bd3872cb61b48600dbb332b111d65d097f Mon Sep 17 00:00:00 2001 From: Norcoen Date: Tue, 3 Jun 2014 14:45:07 +0200 Subject: [PATCH 1/4] Force enclosing of all columns with optional switch --- parsecsv.lib.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/parsecsv.lib.php b/parsecsv.lib.php index b18d95c..aad6df5 100644 --- a/parsecsv.lib.php +++ b/parsecsv.lib.php @@ -145,6 +145,15 @@ class parseCSV { * @var string */ public $enclosure = '"'; + + /** + * Enclose All + * Force enclosing all columns + * + * @access public + * @var bool + */ + public $enclose_all = false; /** * Conditions @@ -1049,7 +1058,7 @@ class parseCSV { if ( $value !== null && $value != '' ) { $delimiter = preg_quote($this->delimiter, '/'); $enclosure = preg_quote($this->enclosure, '/'); - if ( preg_match("/".$delimiter."|".$enclosure."|\n|\r/i", $value) || ($value{0} == ' ' || substr($value, -1) == ' ') ) { + if ( preg_match("/".$delimiter."|".$enclosure."|\n|\r/i", $value) || ($value{0} == ' ' || substr($value, -1) == ' ') || $this->enclose_all ) { $value = str_replace($this->enclosure, $this->enclosure.$this->enclosure, $value); $value = $this->enclosure.$value.$this->enclosure; } From f3c70ad17ca30a44f0aad4273df7dc5ebf71da3f Mon Sep 17 00:00:00 2001 From: Norcoen Date: Tue, 3 Jun 2014 15:01:04 +0200 Subject: [PATCH 2/4] Fix local/global delimiter bug between output() and _enclose_value() by setting global delimiter to local if not null --- parsecsv.lib.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parsecsv.lib.php b/parsecsv.lib.php index aad6df5..f4ef6ef 100644 --- a/parsecsv.lib.php +++ b/parsecsv.lib.php @@ -463,6 +463,9 @@ class parseCSV { if ( $delimiter === null ) { $delimiter = $this->output_delimiter; } + else { + $this->output_delimiter = $delimiter; + } $data = $this->unparse($data, $fields, null, null, $delimiter); From 33b1a0d19623a20df54c89efe07a60373b4aead4 Mon Sep 17 00:00:00 2001 From: Norcoen Date: Tue, 3 Jun 2014 15:02:49 +0200 Subject: [PATCH 3/4] Fix local/global delimiter bug between output() and _enclose_value() by setting global delimiter to local if not null --- parsecsv.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/parsecsv.lib.php b/parsecsv.lib.php index f4ef6ef..88afbbe 100644 --- a/parsecsv.lib.php +++ b/parsecsv.lib.php @@ -464,6 +464,7 @@ class parseCSV { $delimiter = $this->output_delimiter; } else { + $this->delimiter = $delimiter; $this->output_delimiter = $delimiter; } From 0235c24b36163392c12b8b8d7da34c67159116e8 Mon Sep 17 00:00:00 2001 From: Norcoen Date: Tue, 3 Jun 2014 15:52:36 +0200 Subject: [PATCH 4/4] Pass delimiter from unparse function to _enclose_value function, revert changes from previous approach --- parsecsv.lib.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/parsecsv.lib.php b/parsecsv.lib.php index 88afbbe..37d9ed7 100644 --- a/parsecsv.lib.php +++ b/parsecsv.lib.php @@ -463,10 +463,6 @@ class parseCSV { if ( $delimiter === null ) { $delimiter = $this->output_delimiter; } - else { - $this->delimiter = $delimiter; - $this->output_delimiter = $delimiter; - } $data = $this->unparse($data, $fields, null, null, $delimiter); @@ -845,7 +841,7 @@ class parseCSV { // create heading if ( $this->heading && !$append && !empty($fields) ) { foreach( $fields as $key => $value ) { - $entry[] = $this->_enclose_value($value); + $entry[] = $this->_enclose_value($value, $delimiter); } $string .= implode($delimiter, $entry).$this->linefeed; @@ -855,7 +851,7 @@ class parseCSV { // create data foreach( $data as $key => $row ) { foreach( $row as $field => $value ) { - $entry[] = $this->_enclose_value($value); + $entry[] = $this->_enclose_value($value, $delimiter); } $string .= implode($delimiter, $entry).$this->linefeed; @@ -1058,11 +1054,14 @@ class parseCSV { * * @return Processed value */ - public function _enclose_value ($value = null) { + public function _enclose_value ($value = null, $delimiter = null) { + if ( $delimiter === null ) { + $delimiter = $this->delimiter; + } if ( $value !== null && $value != '' ) { - $delimiter = preg_quote($this->delimiter, '/'); - $enclosure = preg_quote($this->enclosure, '/'); - if ( preg_match("/".$delimiter."|".$enclosure."|\n|\r/i", $value) || ($value{0} == ' ' || substr($value, -1) == ' ') || $this->enclose_all ) { + $delimiter_quoted = preg_quote($delimiter, '/'); + $enclosure_quoted = preg_quote($this->enclosure, '/'); + if ( preg_match("/".$delimiter_quoted."|".$enclosure_quoted."|\n|\r/i", $value) || ($value{0} == ' ' || substr($value, -1) == ' ') || $this->enclose_all ) { $value = str_replace($this->enclosure, $this->enclosure.$this->enclosure, $value); $value = $this->enclosure.$value.$this->enclosure; }