Нашел парсер csv файлов в инетрнете, но к сожалению он не хочет работать при парсинге большого файла (на 120000 записей) Ругается на эту часть кода: На функции feof все вылетает похоже, не получается дойти до конца файла. Если делаешь файл меньше по кол-ву строк, то все отлично парсится PHP: function getRecord(){ $isRecord = false; $buffer = ""; while (!feof($this->handle) && !$isRecord) { $buffer .= fgets($this->handle, 4096); if (substr_count($buffer,$this->strDelim) % 2 == 0) $isRecord = true; } if(empty($buffer)) return false; return $buffer; } function close(){ return fclose($this->handle); }
Такая вот ошибка: Warning: feof(): supplied argument is not a valid stream resource in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 63 Warning: fgets(): supplied argument is not a valid stream resource in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 64 Warning: feof(): supplied argument is not a valid stream resource in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 63 Warning: fclose(): supplied argument is not a valid stream resource in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 75
var $delim = ";"; var $strDelim = "\""; var $handle = null; var $config = array(); Не понимаю в чем косяк
Все равно не могу понять, что нужно править в этом скрипте, плиз хэлп: PHP: <?php class ycsvParser { var $delim = ";"; var $strDelim = "\""; var $handle = null; var $config = array(); function __construct($fp,$configLine = false,$delim = ";",$strDelim = "\""){ $this->delim = $delim; $this->strDelim = $strDelim; if (!file_exists($fp) || !is_file($fp) || !is_readable($fp)) { return false; } $handle = @fopen($fp, "r"); if (!$handle) return false; $this->handle = $handle; if ($configLine) { $buffer = $this->getRecord(); $config = $this->parseRecord($buffer); $this->config = $config; } return true; } function parseRecord($buffer) { $buffer = trim($buffer); $buffer = str_replace($this->strDelim.$this->strDelim,'#|#',$buffer); $buffer = preg_replace(array('/'.$this->strDelim.'([ *])'.$this->delim.'/','/'.$this->delim.'([ *])'.$this->strDelim.'/'),array($this->strDelim.$this->delim,$this->delim.$this->strDelim),$buffer); $res = array(); while(strlen($buffer)) { if ($buffer[0] == $this->strDelim) { $buffer_part = $this->explode($buffer,$this->strDelim.$this->delim); $buffer = $buffer_part[1]; $res[] = (string)str_replace("#|#",$this->strDelim,trim($buffer_part[0]," ".$this->strDelim.$this->delim)); }else { $buffer_part = $this->explode($buffer,$this->delim); $buffer = $buffer_part[1]; $res[] = trim($buffer_part[0]," ".$this->delim); } // ситуация, когда последняя колонка - пустая if ($buffer_part[0] == $this->delim && $buffer_part[1] == "") { $res[]=""; } } return $res; } function getRecord(){ $isRecord = false; $buffer = ""; while (!feof($this->handle) && !$isRecord) { $buffer .= fgets($this->handle, 4096); if (substr_count($buffer,$this->strDelim) % 2 == 0) $isRecord = true; } if(empty($buffer)) return false; return $buffer; } function close(){ return fclose($this->handle); } function explode ($string,$to) { $res = array(); $p = strpos($string,$to); if ($p !== false) { $res[0] = substr($string,0, $p+strlen($to)); $res[1] = substr($string,$p+strlen($to)); } else { $res[0] = $string; $res[1] = ""; } return $res; } } ?>
Пробую так: $this->$handle Но эта гадина выдает: Notice: Undefined variable: handle in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 64 Fatal error: Cannot access empty property in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 64
по ходу косяк здесь Код (Text): $handle = @fopen($fp, "r"); if (!$handle) return false; Убери собаку перед fopen и покажи текст ошибки) Если он появится. И еще - покажи как объект создаешь
Собаку убрал, но ничего ровным счетом не изменилось, ошибки те же feof(): supplied argument is not a valid stream resource in C:\Program Files\Apache Software Foundation\Apache2.2\stat\parser\ycsvParser.class.php on line 63 PHP: <?php ini_set ('display_errors', 1); // при тестировани - 1, при работе - ini_set ('display_startup_errors', 1); // при тестировани - 1, при работе - ini_set ('log_errors', 1); // всегда 1. Читайте логи Апача, там будут копиться ПХП-ошибки!!! ini_set ('error_reporting', 2047); // при тестировании - 2047, при работе - 2039 ini_set ('track_errors', 0); // Сохранять ли последнее сообщение об ошибке или предупреждение в переменной $php_errormsg define ('Path', realpath (dirname (__FILE__).'/').'/'); //require_once Path.'sys/system.php'; //require_once Path.'sys/common.php'; if (isset($_FILES['csv_file'])) { /*if ($_FILES['csv_file']['type'] != "text/csv") { //echo "File type must be <b>text/csv</b> but ".$_FILES['csv_file']['type']." given"; } elseif($_FILES['csv_file']['error'] > 0) { echo "Error. Code: ".$_FILES['csv_file']['error']; }*/ require_once Path.'ycsvParser.class.php'; $ycsv = new ycsvParser($_FILES['csv_file']['tmp_name'],true); if (!$ycsv) die("Cannot start a parser"); echo "<table border=1 width=100%>"; if (count($ycsv->config)) { echo "<tr>"; foreach($ycsv->config as $title) { echo "<td>$title</td>"; } echo "</tr>"; } while ($record = $ycsv->getRecord()) { $res = $ycsv->parseRecord($record); if (count($ycsv->config) && count($res) != count($ycsv->config)) { echo ("Config has <b>".count($ycsv->config)."</b> fields,<b>".count($res)."</b> given!"); } else { if (count($res)) { echo "<tr>"; foreach($res as $title) { echo "<td>$title</td>"; } echo "</tr>"; } } } echo "</table>"; $ycsv->close(); } ?>
хз, вроде норм думаю ошибка все таки где-то здесь $handle = @fopen($fp, "r"); Попробуй if (!$handle) return false; заменить на if (!is_resourse($handle)) die('Открыть файл не удалось')
Похоже файл открывается, потому что ошибки остались прежними Это все печально, уже несколько часов ломаю голову Сколько скрипт не разбирал все вроде бы правильно, должен и большие файлы наверное разбирать!