Parser un fichier ligne par ligne

Parser un fichier ligne par ligne - PHP - Programmation

Marsh Posté le 21-05-2006 à 20:59:04    

Voilou je dois parser un fichier xml et j'ai un petit souci avec fread. Comme 2ème argument de fread, il faut indiquer la taille du bloc à lire.  
J'avais mis 1024 au début mais je me suis vite apercus que certaines balises de mon fichier XML n'etait pas inserer dans ma base de donnée. J'ai alors augmenté la longueur à 2024 et bingo, c'etait ca.  
 
Le problème c'est que j'aimerais lire ligne par ligne mais si je mets un nombre trop petit, ca va lire la moitié de la ligne, si je mets trop grand, il va y avoir un décalage. Ca va lire la ligne en entiere et une partie de ligne suivante, ce qui fait que ca fait merder mon parsage.  
 
La solution serait de charger tout dans une variable mais c'est pas tres propre comme solution : fread ($fd, filesize ($filename))
 
Je sais pas trop quoi faire, comment faire ?  
 
J'ai regardé, dans les tutos dont celui de commentcamarche, zend et ils font pareil que moi.  
http://www.commentcamarche.net/php/phpxml.php3
http://www.zend.com/zend/art/parsing.php
 
Il parse au fur et mesure de la lecture du fichier mais leur systeme n'est pas du tout fiable non plus.
 
 
 
voici mon bout de code si cela peut servir ...
 
PS : je suis en PHP4  :cry: bien sur sinon je me serais renseigné sur le fameux simpleXML  :sol:  

Code :
  1. function exportToMySQL ($tablename, $champs)
  2.  {
  3.   $this->parser = xml_parser_create();
  4.   xml_set_object($this->parser, $this);
  5.   xml_set_element_handler ($this->parser, 'OpenTag', 'CloseTagToMySQL');
  6.   xml_set_character_data_handler($this->parser, 'donnee');
  7.   while ($fd = parsingXML::LectureFichier ())
  8.   {
  9.    echo "<br><br>lecture de fichier = ".$fd;
  10.    parsingXML::ParseData ($fd);
  11.   }
  12.  }
  13.  //méthode privée
  14.  function ParseDaTa ($data)
  15.  {
  16.    if(!xml_parse($this->parser, $data))
  17.    {
  18.     die(sprintf("<br>XML error: %s at line %d",
  19.     xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser)));
  20.  
  21.    }
  22.  }
  23.  function LectureFichier ()
  24.  {
  25.   static $fd;
  26.   if ($fd == "" )
  27.    $fd = fopen ($this->fichier, "r" );
  28.   if (feof($fd))
  29.   { fclose ($fd);
  30.    return FALSE;
  31.   }
  32.   else
  33.   {
  34.    return fread ($fd, 2024);
  35.   }
  36.  }
  37.  function OpenTag ($parser, $tagName, $attribu)
  38.  {
  39.   echo "<br>OpenTag : ".$tagName;
  40.   $attribu = implode("|", $attribu);
  41.   $this->TabLine[$tagName]="";
  42.   $this->TagNameCurrent = $tagName;
  43.  if (trim ($attribu) != "" )
  44.   $this->TabLine[$tagName]=$attribu;
  45.  }
  46.  function CloseTagToMySQL ($parser, $tagName)
  47.  {
  48.   if (trim($tagName) == $this->NewLine)
  49.   {
  50.    $q = "INSERT `INDEX_EUROPE` set TRANSACTION_ID='".$this->TabLine['TRANSACTION']."', MSISDN='".$this->TabLine['MSISDN']."',
  51.    DATE='".$this->TabLine['DATE']."', PRICE='".$this->TabLine['PRICE']."', CURRENCY='".$this->TabLine['CURRENCY']."', TAG='".$this->TabLine['TAG']."',
  52.    MODE='".$this->TabLine['MODE']."', STATUS='".$this->TabLine['STATUS']."', NOTICE='".$this->TabLine['NOTICE']."', PRODUCT_ID='".$this->TabLine['PRODUCT']."',
  53.    TYPE='".$this->TabLine['TYPE']."', LABEL='".$this->TabLine['LABEL']."'
  54.    ";
  55.    $rm = mysql_query ($q); 
  56.    if (!$rm)
  57.     echo ('<br><br>Requête invalide : ' . mysql_error());
  58.   }
  59.  }
  60.  function donnee ($parser, $data)
  61.  {
  62.   $data = addslashes ($data);
  63.   if (trim ($data) != "" )
  64.   {
  65.    $this->TabLine[$this->TagNameCurrent] = $data;
  66.   }
  67.   $this->TagNameCurrent = "";
  68.  }
  69. }

Reply

Marsh Posté le 21-05-2006 à 20:59:04   

Reply

Marsh Posté le 21-05-2006 à 21:03:13    

Reply

Marsh Posté le 21-05-2006 à 21:21:05    

Citation :

file
 
(PHP 3, PHP 4, PHP 5)
file -- Reads entire file into an array


 
et bien c'est ce que j'aimerais bien eviter de faire si j'ai un gros fichier .....
 

Reply

Marsh Posté le 21-05-2006 à 21:40:03    

bon je viens de découvrir une vrai fonction  :o  que j'ai nommé fgets qui lit ligne par ligne.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed