За последние 24 часа нас посетили 15533 программиста и 1490 роботов. Сейчас ищут 909 программистов ...

парсер на php

Тема в разделе "PHP для новичков", создана пользователем lssbor, 16 дек 2010.

  1. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Нашел парсер csv файлов в инетрнете, но к сожалению он не хочет работать при парсинге большого файла (на 120000 записей)
    Ругается на эту часть кода:
    На функции feof все вылетает похоже, не получается дойти до конца файла. Если делаешь файл меньше по кол-ву строк, то все отлично парсится

    PHP:
    1. function getRecord(){
    2.         $isRecord = false;
    3.         $buffer = "";
    4.         while (!feof($this->handle) && !$isRecord) {
    5.             $buffer .= fgets($this->handle, 4096);
    6.             if (substr_count($buffer,$this->strDelim) % 2 == 0)
    7.                 $isRecord = true;              
    8.         }
    9.        
    10.         if(empty($buffer))
    11.             return false;
    12.         return $buffer;
    13.     }
    14.    
    15.     function close(){
    16.         return fclose($this->handle);      
    17.     }
     
  2. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Такая вот ошибка:

    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
     
  3. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
     
  4. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    var $delim = ";";
    var $strDelim = "\"";
    var $handle = null;
    var $config = array();

    Не понимаю в чем косяк
     
  5. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Все равно не могу понять, что нужно править в этом скрипте, плиз хэлп:

    PHP:
    1. <?php
    2.  
    3. class ycsvParser {
    4.     var $delim = ";";
    5.     var $strDelim = "\"";
    6.     var $handle = null;
    7.     var $config = array();
    8.    
    9.     function __construct($fp,$configLine = false,$delim = ";",$strDelim = "\""){
    10.         $this->delim = $delim;
    11.         $this->strDelim = $strDelim;   
    12.  
    13.         if (!file_exists($fp) || !is_file($fp) || !is_readable($fp)) {
    14.             return false;
    15.         }
    16.            
    17.         $handle = @fopen($fp, "r");
    18.         if (!$handle)
    19.             return false;
    20.        
    21.         $this->handle = $handle;
    22.        
    23.         if ($configLine) {
    24.             $buffer = $this->getRecord();
    25.             $config = $this->parseRecord($buffer);
    26.             $this->config = $config;           
    27.         }
    28.         return true;
    29.     }
    30.    
    31.    
    32.     function parseRecord($buffer) {
    33.         $buffer = trim($buffer);
    34.         $buffer = str_replace($this->strDelim.$this->strDelim,'#|#',$buffer);
    35.         $buffer = preg_replace(array('/'.$this->strDelim.'([ *])'.$this->delim.'/','/'.$this->delim.'([ *])'.$this->strDelim.'/'),array($this->strDelim.$this->delim,$this->delim.$this->strDelim),$buffer);
    36.            
    37.         $res = array();
    38.         while(strlen($buffer)) {
    39.             if ($buffer[0] == $this->strDelim) {   
    40.                 $buffer_part = $this->explode($buffer,$this->strDelim.$this->delim);
    41.                 $buffer = $buffer_part[1];
    42.                 $res[] = (string)str_replace("#|#",$this->strDelim,trim($buffer_part[0]," ".$this->strDelim.$this->delim));
    43.                    
    44.             }else {
    45.                 $buffer_part =  $this->explode($buffer,$this->delim);
    46.                 $buffer = $buffer_part[1];             
    47.                 $res[] = trim($buffer_part[0]," ".$this->delim);                       
    48.             }
    49.            
    50.             //  ситуация, когда последняя колонка - пустая
    51.             if ($buffer_part[0] == $this->delim && $buffer_part[1] == "") {
    52.                 $res[]="";
    53.             }
    54.         }
    55.        
    56.         return $res;
    57.        
    58.     }
    59.    
    60.     function getRecord(){
    61.         $isRecord = false;
    62.         $buffer = "";
    63.         while (!feof($this->handle) && !$isRecord) {
    64.             $buffer .= fgets($this->handle, 4096);
    65.             if (substr_count($buffer,$this->strDelim) % 2 == 0)
    66.                 $isRecord = true;              
    67.         }
    68.        
    69.         if(empty($buffer))
    70.             return false;
    71.         return $buffer;
    72.     }
    73.    
    74.     function close(){
    75.         return fclose($this->handle);      
    76.     }
    77.    
    78.     function explode ($string,$to) {
    79.         $res = array();
    80.         $p = strpos($string,$to);
    81.         if ($p !== false) {
    82.           $res[0] =  substr($string,0, $p+strlen($to));
    83.           $res[1] =  substr($string,$p+strlen($to));
    84.         } else {
    85.             $res[0] =  $string;
    86.             $res[1] =  "";
    87.         }
    88.         return $res;
    89.     }  
    90.    
    91. }
    92. ?>
     
  6. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Пробую так: $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
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    по ходу косяк здесь

    Код (Text):
    1.  $handle = @fopen($fp, "r");
    2.           if (!$handle)
    3.               return false;
    Убери собаку перед fopen и покажи текст ошибки) Если он появится.

    И еще - покажи как объект создаешь
     
  8. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Собаку убрал, но ничего ровным счетом не изменилось, ошибки те же 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:
    1. <?php
    2. ini_set ('display_errors', 1); // при тестировани - 1, при работе -
    3. ini_set ('display_startup_errors', 1); // при тестировани - 1, при работе -
    4. ini_set ('log_errors', 1); // всегда 1. Читайте логи Апача, там будут копиться ПХП-ошибки!!!
    5. ini_set ('error_reporting', 2047); // при тестировании - 2047, при работе - 2039
    6. ini_set ('track_errors', 0); // Сохранять ли последнее сообщение об ошибке или предупреждение в переменной $php_errormsg
    7.  
    8.  
    9.  
    10. define ('Path', realpath (dirname (__FILE__).'/').'/');
    11. //require_once Path.'sys/system.php';
    12. //require_once Path.'sys/common.php';
    13.  
    14. if (isset($_FILES['csv_file'])) {
    15.     /*if ($_FILES['csv_file']['type'] != "text/csv") {
    16.         //echo "File type must be <b>text/csv</b> but ".$_FILES['csv_file']['type']." given";
    17.     } elseif($_FILES['csv_file']['error'] > 0) {
    18.         echo "Error. Code: ".$_FILES['csv_file']['error'];
    19.     }*/
    20.        
    21.         require_once Path.'ycsvParser.class.php';
    22.         $ycsv = new ycsvParser($_FILES['csv_file']['tmp_name'],true);
    23.         if (!$ycsv)
    24.             die("Cannot start a parser");
    25.            
    26.         echo "<table border=1 width=100%>";
    27.         if (count($ycsv->config)) {
    28.             echo "<tr>";
    29.             foreach($ycsv->config as $title) {
    30.                 echo "<td>$title</td>";
    31.             }
    32.             echo "</tr>";
    33.         }
    34.        
    35.         while ($record = $ycsv->getRecord()) {
    36.             $res = $ycsv->parseRecord($record);
    37.             if (count($ycsv->config) && count($res) != count($ycsv->config)) {
    38.                 echo ("Config has <b>".count($ycsv->config)."</b> fields,<b>".count($res)."</b> given!");
    39.             } else {
    40.                 if (count($res)) {
    41.                     echo "<tr>";
    42.                     foreach($res as $title) {
    43.                         echo "<td>$title</td>";
    44.                     }
    45.                     echo "</tr>";
    46.                                        
    47.                 }
    48.             }      
    49.    
    50.         }
    51.         echo "</table>";
    52.        
    53.         $ycsv->close();
    54.    
    55.    
    56. }  
    57.  
    58. ?>
     
  9. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Вот вся парсилка, все работает если файл из маленького кол-ва строк
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    хз, вроде норм

    думаю ошибка все таки где-то здесь

    $handle = @fopen($fp, "r");

    Попробуй
    if (!$handle)
    return false;

    заменить на
    if (!is_resourse($handle))
    die('Открыть файл не удалось')
     
  11. lssbor

    lssbor Активный пользователь

    С нами с:
    15 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Saint-Petesburg
    Похоже файл открывается, потому что ошибки остались прежними
    Это все печально, уже несколько часов ломаю голову
    Сколько скрипт не разбирал все вроде бы правильно, должен и большие файлы наверное разбирать!:(