|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-08-17 14:25 UTC] tjerk dot meesters at gmail dot com
Description:
------------
The fgetcsv() of PHP 4.3.4 works fine, however, as of 4.3.8 the behaviour concerning escaped string qualifiers changed.
With single line data, an initial escaped string qualifier doesn't get noticed.
With multiple line data, the last occurrence of an escaped string qualifier doesn't get noticed.
For the example code, use the following data:
-------------------------
CSV DATA (test.csv)
-------------------------
test;test spaced string;"test; with delimeter";"""test with inline double quotes""";"test
with
newlines";"""test
with
newlines and double quotes"""
Reproduce code:
---------------
<?php
$f=fopen('test.csv','rb');
while (!feof($f)) {
$s = fgetcsv($f,1000,';','"');
print_r($s);
}
fclose($f);
?>
Expected result:
----------------
Array
(
[0] => test
[1] => test spaced string
[2] => test; with delimeter
[3] => "test with inline double quotes"
[4] => test
with
newlines
[5] => "test
with
newlines and double quotes"
)
Actual result:
--------------
Array
(
[0] => test
[1] => test spaced string
[2] => test; with delimeter
[3] => test with inline double quotes"
[4] => test
with
newlines
[5] => "test
with
newlines and double quotes
)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 22:00:01 2025 UTC |
Result is now: Array ( [0] => test [1] => test spaced string [2] => test; with delimeter [3] => test with inline double quotes" [4] => test with newlines [5] => "test with newlines and double quotes" ) Although the test with newlines and double quotes works fine now, the problem still lies with test 3: the inline double quote.With latest CVS I get the correct output of: Array ( [0] => test [1] => test spaced string [2] => test; with delimeter [3] => "test with inline double quotes" [4] => test with newlines [5] => "test with newlines and double quotes" )I meant that the problem is still there ;-) I've been browsing through the code and finally came up with the following patch: *** file.c.orig Fri Aug 20 02:30:27 2004 --- file.c Fri Aug 20 02:30:37 2004 *************** *** 2391,2399 **** if ((p = memchr(p2, delimiter, (e - p2)))) { p2 = s; s = p + 1; - if (*p2 == enclosure) { - p2++; - } /* copy data to buffer */ buf2 = erealloc(buf2, buf2_len + (p - p2) + 1); --- 2391,2396 ---- After setting p2 to s it doesn't seem like a good idea to check if the first character is a delimiter, since you might want to start a string with two consecutive double quotes. By increasing p2, thus effectively removing the first double quote, the trim_enclosed() function will regard the remaining double quote as garbage and ignore it. The patch has been tested and passes the above mentioned tests.