note 85612 added to function.fgetcsv

From: 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

« previous php.notes (#144249) next »