note 85612 added to function.fgetcsv
| From: | marcosatyuniticom at osu1 dot php dot net | Date: | Mon, 08 Sep 2008 23:35:27 +0000 |
| Subject: | note 85612 added to function.fgetcsv | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-144249@lists.php.net to get a copy of this message | ||
Smarter/better fgetcsv functions, acceptying multiple-character delim, enclosure, and escape.
define('BUFFER_READ_LEN', 4096);
function fgetcsv_ex($file_handle, $delim = ',', $enclosure = '"', $escape =
'"') {
$fields = null;
$fldCount = 0;
$inQuotes = false;
$complete = false;
$search_chars_list = array('\r\n', '\n', '\r');
if ( $delim && ($delim != '') )
$search_chars_list[] = $delim;
if ( $enclosure && ($enclosure != '') )
{
$search_chars_list[] = $enclosure;
$enclosure_len = strlen($enclosure);
}
else
$enclosure_len = 0;
if ( $escape && ($escape != '') )
{
$search_chars_list[] = $escape;
$escape_len = strlen($escape);
}
else
$escape_len = 0;
$search_regex = '/' . implode('|', $search_chars_list) . '/';
$cur_pos = 0;
$line = '';
$cur_value = '';
$in_value = false;
$last_value = 0;
while ( ! $complete )
{
$read_result = fread($file_handle, BUFFER_READ_LEN);
if ( $read_result )
$line .= $read_result;
else if ( strlen($line) == 0 )
return null;
else
$line .= "\n";
$line_len = strlen($line);
while ( true )
{
if (! preg_match($search_regex, $line, $matches, PREG_OFFSET_CAPTURE, $cur_pos))
{
if ($read_result) //need more chars
break;
else
return null; //Incomplete file
}
else
{
$non_escape = false;
$cur_char = $matches[0][0];
$cur_len = strlen($cur_char);
$new_pos = $matches[0][1];
if (($enclosure == $escape) && $in_value && ($cur_char == $escape))
//Escape char = enclosure char special handling
{
if (($new_pos + $cur_len + $enclosure_len) >= $line_len) //We need the next char
break;
$next_char = substr($line, $new_pos + $cur_len, $enclosure_len);
if ( (! $enclosure) || ($next_char != $enclosure) )
$non_escape = true;
}
$cur_pos = $new_pos;
if ( $in_value && (! $non_escape) )
{
$cur_value .= mb_substr($line, $last_value, $cur_pos - $last_value);
if ($cur_char == $escape) //Skip escape char
$cur_pos += $escape_len;
$last_value = $cur_pos;
}
else if ( ( $cur_char == "\n" ) || ( $cur_char == "\r" ) || (
$cur_char == "\r\n" ) )
{
$blank_start_lines = ( $cur_pos == 0 );
++$cur_pos;
$cur_pos = $cur_pos + strspn($line, "\n\r", $cur_pos);
if ( ! $blank_start_lines )
{
$complete = true;
break;
}
else
{
$last_value = $cur_pos;
continue;
}
}
else if ( $cur_char == $delim )
{
if ( is_null($fields) )
$fields = array();
$fields[] = $cur_value . trim(mb_substr($line, $last_value, $cur_pos - $last_value));
$last_value = $cur_pos + $cur_len;
$cur_value = '';
}
else if ( $cur_char == $enclosure )
{
if ( $in_value )
$cur_value .= mb_substr($line, $last_value, $cur_pos - $last_value);
$last_value = $cur_pos + $cur_len;
$in_value = ! $in_value;
}
$cur_pos += $cur_len;
}
}
}
fseek($file_handle, $cur_pos - strlen($line), SEEK_CUR);
return $fields;
}
----
Server IP: 64.71.164.2
Probable Submitter: 66.215.234.59
----
Manual Page -- http://www.php.net/manual/en/function.fgetcsv.php
Edit -- https://master.php.net/note/edit/85612
Del: integrated -- https://master.php.net/note/delete/85612/integrated
Del: useless -- https://master.php.net/note/delete/85612/useless
Del: bad code -- https://master.php.net/note/delete/85612/bad+code
Del: spam -- https://master.php.net/note/delete/85612/spam
Del: non-english -- https://master.php.net/note/delete/85612/non-english
Del: in docs -- https://master.php.net/note/delete/85612/in+docs
Del: other reasons-- https://master.php.net/note/delete/85612
Reject -- https://master.php.net/note/reject/85612
Search -- https://master.php.net/manage/user-notes.php