Page 1 sur 1

Comment enlever 
 dans un explode de fichie

Posté : 26 oct. 2006, 09:56
par edophie
Bonjour
j'ai un soucis avec un script.
Son but est de lire un fichier txt et de l'exploser et construire un fichier xml.
Mon fichier est constitué de 8 parties coupé par ; mais il arrive que le dernier élément manque alors j'ai un soucis car apparait alors



Voici le script et fichiers:

Fichier de départ :

Code : Tout sélectionner

8025;29000;FR9909090909;BT;20070925;9447.82;0.046695 8025;29000;FR9909090909;BT;20071001;9452.67

une partie du fichier php :
while (!feof($fp)) {  
    $ligne = fgets($fp);  
    $fragments = explode(';', $ligne); 
     
    if ($codeIsinPrec!="" && $codeIsinPrec!=$fragments[2]) 
    { 
        $nomFichier ="cours/cours".$todayY.$sTodaym.$sTodayj ; 
         
         
        if (!isset($fichiers_sortie[$nomFichier])) {  
            $fichiers_sortie[$nomFichier] = new DOMDocument('1.0', 'ISO-8859-1'); 
             
         
             
             
         if (file_exists($nomFichier . ".xml")) 
          { 
              $fichiers_sortie[$nomFichier]->load($nomFichier . ".xml") ; 
          } 
           
        } 
         
        $dom = $fichiers_sortie[$nomFichier];  
        try {  
           
                    $xpath = new DOMXPath($dom);  
            if ($bPremiereFois) {  
                  if (!file_exists($nomFichier . ".xml")) 
                   { 
                      $id = $dom->createElement("mvts"); 
                     $dom->appendChild($id); 
                    } 
                else 
                 { 
                    $id = $xpath->evaluate("mvts")->item(0); 
                } 
                $bPremiereFois = false; 
            } 
                         
                         
                        $node = $xpath->evaluate("mvt[@code_isin='{$fragmentsPrec[2]}']")->item(0); 
                        if ($node==null) 
                        { 
             
                            $mvt = $dom->createElement('mvt');  
                $mvt->setAttribute('code_cns', $fragmentsPrec[0].$fragmentsPrec[1]);  
                  $mvt->setAttribute('code_isin', $fragmentsPrec[2]); 
                $mvt->setAttribute('dateValeur', $fragmentsPrec[4]);  
                $mvt->setAttribute('cours', $fragmentsPrec[5]); 
                $mvt->setAttribute('volatilite', $fragmentsPrec[6]); 
                            $id->appendChild($mvt); 
                        } 
                     
             
                     
        } catch (Exception $e) {  
            die('Ligne ' . $e->getLine() . ' : ' . $e->getMessage());  
        }  
    }  
     
    $codeIsinPrec = $fragments[2]; 
    $fragmentsPrec = $fragments; 
} 
fclose($fp);  

  

et voici l'arrivée en xml :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <mvts><mvt code_cns="802529000" code_isin="FR9909090909" dateValeur="20091001" cours="9452.67 " volatilite=""/><mvt code_cns="40251712000" code_isin="FR2121212121" dateValeur="20070925" cours="9000.82" volatilite="1.046695 "/>


Je ne sais pas comment enlever


Merci beaucoup

Posté : 26 oct. 2006, 11:05
par Ryle
Y a des morceaux de ton message qui n'apparaissent pas, donc on comprend pas tout bien ce qui t'arrive :(

A tout hasard, je te dirais de tester l'existance de $fragmentsPrec[6] avec un isSet() puisque celui-ci n'est pas nécessairement renseigné dans ton fichier, et de gérer le fait que celui-ci puisse être inexistant au lieu de l'utiliser quoi qu'il arrive.. :)

Posté : 26 oct. 2006, 11:12
par Invité
Désolé, voici tous le code :
<?php 
$fichiers_sortie = array(); 
$fp = fopen('batcheclatement/CQFIC270.TXT', 'r'); 
$bPremiereFois = true;
$todayj = date("j");
if ($todayj < 10) {
$sTodayj = "0".$todayj;
}
else {
$sTodayj = "".$todayj;
}
$todaym = date("m");
if ($todaym < 10) {
$sTodaym = "0".$todaym;
}
else {
$sTodaym = "".$todaym;
}
$todayY = date("Y");
$codeIsinPrec="";
$fragments = "";
$fragmentsPrec = "";

while (!feof($fp)) { 
    $ligne = fgets($fp); 
	$fragments = explode(';', $ligne);
	
	if ($codeIsinPrec!="" && $codeIsinPrec!=$fragments[2])
	{
		$nomFichier ="cours/cours".$todayY.$sTodaym.$sTodayj ;
		
		
	    if (!isset($fichiers_sortie[$nomFichier])) { 
			$fichiers_sortie[$nomFichier] = new DOMDocument('1.0', 'ISO-8859-1');
			
		
			
			
		 if (file_exists($nomFichier . ".xml"))
		  {
		  	$fichiers_sortie[$nomFichier]->load($nomFichier . ".xml") ;
		  }
		  
	    }
		
	    $dom = $fichiers_sortie[$nomFichier]; 
	    try { 
	      
	                $xpath = new DOMXPath($dom); 
			if ($bPremiereFois) { 
	              if (!file_exists($nomFichier . ".xml"))
				   {
				  	$id = $dom->createElement("mvts");
					 $dom->appendChild($id);
					}
				else
				 {
					$id = $xpath->evaluate("mvts")->item(0);
				}
				$bPremiereFois = false;
			}
						
						
						$node = $xpath->evaluate("mvt[@code_isin='{$fragmentsPrec[2]}']")->item(0);
						if ($node==null)
						{
			
							$mvt = $dom->createElement('mvt'); 
				$mvt->setAttribute('code_cns', $fragmentsPrec[0].$fragmentsPrec[1]); 
  		        $mvt->setAttribute('code_isin', $fragmentsPrec[2]);
				$mvt->setAttribute('dateValeur', $fragmentsPrec[4]); 
				$mvt->setAttribute('cours', $fragmentsPrec[5]);
				$mvt->setAttribute('volatilite', $fragmentsPrec[6]);
	                		$id->appendChild($mvt);
						}
					
	        
					
	    } catch (Exception $e) { 
	        die('Ligne ' . $e->getLine() . ' : ' . $e->getMessage()); 
	    } 
	} 
	
	$codeIsinPrec = $fragments[2];
	$fragmentsPrec = $fragments;
}
fclose($fp); 

$dom = $fichiers_sortie[$nomFichier]; 
try { 
    
              $xpath = new DOMXPath($dom); 
if ($bPremiereFois) { 
            if (!file_exists($nomFichier . ".xml"))
	   {
	  	$id = $dom->createElement("mvts");
		 $dom->appendChild($id);
		}
	else
	 {
		$id = $xpath->evaluate("mvts")->item(0);
	}
	$bPremiereFois = false;
}
			
			$node = $xpath->evaluate("mvt[@code_isin='{$fragmentsPrec[2]}']")->item(0);
			if ($node==null)
			{
			
			//if ($fragmentsPrec[6]=""){$fragmentsPrec[6]="0"};
				$mvt = $dom->createElement('mvt'); 
  		        	$mvt->setAttribute('code_cns', $fragmentsPrec[0].$fragmentsPrec[1]); 
  		        $mvt->setAttribute('code_isin', $fragmentsPrec[2]);
				$mvt->setAttribute('dateValeur', $fragmentsPrec[4]); 
				$mvt->setAttribute('cours', $fragmentsPrec[5]);
				$mvt->setAttribute('volatilite', $fragmentsPrec[6]);
              		$id->appendChild($mvt);
			}
	
  } catch (Exception $e) { 
      die('Ligne ' . $e->getLine() . ' : ' . $e->getMessage()); 
  } 

foreach ($fichiers_sortie as $k => $v) { 
    $v->save("$k.xml"); 
    unset($fichiers_sortie[$k]); 
} 

pour le fichier de départ et d'arrivée tu l'as.
Concernant ta remarque pour tester j'avais effectivement essayé de faire
if ($fragmentsPrec[6]=""){$fragmentsPrec[6]="0"};
mais cela ne change rien : au contraire : cela me met erreur

Merci

Posté : 26 oct. 2006, 11:27
par Ryle
Pour la comparaison c'est "==" et non "=", sinon tu affectes la valeur, et ton test est toujours vrai :) Mais je pensais plus à un test sur l'existance de l'index :
// si la valeur existe on l'utilise, sinon on met zéro
$volatilite = (isSet($fragmentsPrec[6])) ? $fragmentsPrec[6] : 0; 

$mvt->setAttribute('volatilite', $volatilite); // on utilise la variable
(A faire aux deux endroits où tu fais appel à $fragmentsPrec[6])

Posté : 26 oct. 2006, 11:47
par Invité
Voilà le script :
$fichiers_sortie = array(); 
$fp = fopen('batcheclatement/CQFIC270.TXT', 'r'); 
$bPremiereFois = true;
$todayj = date("j");
if ($todayj < 10) {
$sTodayj = "0".$todayj;
}
else {
$sTodayj = "".$todayj;
}
$todaym = date("m");
if ($todaym < 10) {
$sTodaym = "0".$todaym;
}
else {
$sTodaym = "".$todaym;
}
$todayY = date("Y");
$codeIsinPrec="";
$fragments = "";
$fragmentsPrec = "";

while (!feof($fp)) { 
    $ligne = fgets($fp); 
	$fragments = explode(';', $ligne);
	
	if ($codeIsinPrec!="" && $codeIsinPrec!=$fragments[2])
	{
		$nomFichier ="cours/cours".$todayY.$sTodaym.$sTodayj ;
		
		
	    if (!isset($fichiers_sortie[$nomFichier])) { 
			$fichiers_sortie[$nomFichier] = new DOMDocument('1.0', 'ISO-8859-1');
			
		
			
			
		 if (file_exists($nomFichier . ".xml"))
		  {
		  	$fichiers_sortie[$nomFichier]->load($nomFichier . ".xml") ;
		  }
		  
	    }
		
	    $dom = $fichiers_sortie[$nomFichier]; 
	    try { 
	      
	                $xpath = new DOMXPath($dom); 
			if ($bPremiereFois) { 
	              if (!file_exists($nomFichier . ".xml"))
				   {
				  	$id = $dom->createElement("mvts");
					 $dom->appendChild($id);
					}
				else
				 {
					$id = $xpath->evaluate("mvts")->item(0);
				}
				$bPremiereFois = false;
			}
						
						
						$node = $xpath->evaluate("mvt[@code_isin='{$fragmentsPrec[2]}']")->item(0);
						if ($node==null)
						{
				$mvt = $dom->createElement('mvt'); 
  		        	$mvt->setAttribute('code_cns', $fragmentsPrec[0].$fragmentsPrec[1]); 
  		        $mvt->setAttribute('code_isin', $fragmentsPrec[2]);
				$mvt->setAttribute('dateValeur', $fragmentsPrec[4]); 
				$mvt->setAttribute('cours', $fragmentsPrec[5]);
			// si la valeur existe on l'utilise, sinon on met zéro 
$volatilite = (isSet($fragmentsPrec[6])) ? $fragmentsPrec[6] : 0;  

$mvt->setAttribute('volatilite', $volatilite); // on utilise la variable 

              		$id->appendChild($mvt);
						}
					
	        
					
	    } catch (Exception $e) { 
	        die('Ligne ' . $e->getLine() . ' : ' . $e->getMessage()); 
	    } 
	} 
	
	$codeIsinPrec = $fragments[2];
	$fragmentsPrec = $fragments;
}
fclose($fp); 

$dom = $fichiers_sortie[$nomFichier]; 
try { 
    
              $xpath = new DOMXPath($dom); 
if ($bPremiereFois) { 
            if (!file_exists($nomFichier . ".xml"))
	   {
	  	$id = $dom->createElement("mvts");
		 $dom->appendChild($id);
		}
	else
	 {
		$id = $xpath->evaluate("mvts")->item(0);
	}
	$bPremiereFois = false;
}
			
			$node = $xpath->evaluate("mvt[@code_isin='{$fragmentsPrec[2]}']")->item(0);
			if ($node==null)
			{
				$mvt = $dom->createElement('mvt'); 
  		        	$mvt->setAttribute('code_cns', $fragmentsPrec[0].$fragmentsPrec[1]); 
  		        $mvt->setAttribute('code_isin', $fragmentsPrec[2]);
				$mvt->setAttribute('dateValeur', $fragmentsPrec[4]); 
				$mvt->setAttribute('cours', $fragmentsPrec[5]);
			// si la valeur existe on l'utilise, sinon on met zéro 
$volatilite = (isSet($fragmentsPrec[6])) ? $fragmentsPrec[6] : 0;  

$mvt->setAttribute('volatilite', $volatilite); // on utilise la variable 

              		$id->appendChild($mvt);
			}
	
  } catch (Exception $e) { 
      die('Ligne ' . $e->getLine() . ' : ' . $e->getMessage()); 
  } 

foreach ($fichiers_sortie as $k => $v) { 
    $v->save("$k.xml"); 
    unset($fichiers_sortie[$k]); 
} 

Mais comme tu peux le voir, cela ne change en rien le résultat :
Résultat :
mon fichier XML

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <mvts><mvt code_cns="802529000" code_isin="FR9909090909" dateValeur="20091001" cours="9452.67 " volatilite="0"/><mvt code_cns="40251712000" code_isin="FR2121212121" dateValeur="20070925" cours="9000.82" volatilite="1.046695 "/>

est encore présent
ET C'EST GALERE

Posté : 26 oct. 2006, 13:03
par Ryle
Ok, au temps pour moi.. le soucis vient du fgets qui te conserve le retour charriot dans la ligne qu'il te renvoi (bon ça n'enlève rien au test que tu as ajouté :))

Tu peux le virer avec un simple str_replace(), ou preg_replace(). Quelque chose du genre :
$ligne = fgets($fp);  
$ligne = str_replace("\r\n", "", $ligne); // supprimer les retours charriot

$fragments = explode(';', $ligne);
...

Posté : 26 oct. 2006, 14:39
par Invité
super
ça roule parfait
@+