Comment enlever 
 dans un explode de fichie

edophie
Invité n'ayant pas de compte PHPfrance

26 oct. 2006, 09:56

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2006, 11:05

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.. :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

26 oct. 2006, 11:12

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2006, 11:27

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])
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

26 oct. 2006, 11:47

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2006, 13:03

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);
...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

26 oct. 2006, 14:39

super
ça roule parfait
@+