note 85612 deleted from function.fgetcsv by danbrown

From: Date: Sun, 17 May 2009 18:07:12 +0000
Subject: note 85612 deleted from function.fgetcsv by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-155062@lists.php.net to get a copy of this message
Note Submitter: marcos at yuniti com ---- Smarter/better fgetcsv functions, acceptying multiple-character delim, enclosure, and escape. <?php 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; } ?>

« previous php.notes (#155062) next »