Page 1 sur 1

Récupérer une portion de chaine ligne par ligne..

Posté : 01 déc. 2005, 17:27
par Yohann_06
Bonjour,

voilà, j'ai un fichier .txt dont le contenu ce présente sous cette forme,

Code : Tout sélectionner

8V6176178426400COL COMMANDES N° 1108 xxx xxxxxxx 8V6176178426480COL COMMANDES N° 2000 xxx xxxxxxx 8V6176178426480COL COMMANDES N° 2080 xxx xxxxxxx
je souhaiterai pouvoir extraire dans ce fichier, "8V6176178426400COL" et "1108" pour chaque ligne, je me suis un peut documenté sur la fonction fopen le problème étant pour extraire uniquement les parties qui m'intéresse mais surtout, les conserver dans un tableau car il va s'agir ensuite de comparer "1108" qui est l'order id à celui de ma bdd..

merci pour vos réponses

Yo

Re: Récupérer une portion de chaine ligne par ligne..

Posté : 01 déc. 2005, 18:03
par mario
As tu testé Explode ?
<?php
$chaine = '8V6176178426400COL COMMANDES N° 1108 xxx xxxxxxx';
$chaine = explode(" ",$chaine);

$ref = $chaine[0];
$noCommande = $chaine[3];

/*
  $ref = 8V6176178426400COL
  $noCommande = 1108
*/
?>
Je pense qu'il faut lire le fichier ligne par ligne et stocker les ref et noCommande dans un tableau

Posté : 01 déc. 2005, 18:40
par Yohann_06
je n'ai comme seul exemple à partir duquel je peux bosser,
<?php
$ouvre=fopen("texte.txt","r");  // ouverture du fichier
while (!feof ($ouvre)) // tant que pas en fin de fichier
{
$lecture = fgets($ouvre, 4096); // stockage dans $lecture
$donnee = explode("*",$lecture);  // parsing des données basé sur "*")
$combien = count($donnee)-1; // nbre d'éléments séparés par "*"
echo "<b>Ce fichier contient ",$combien," données : </b><br><br>";
for ($i=0;$i<=$combien;$i++){
echo $donnee[$i],"<br>";  // affichage des données
}
}
fclose($ouvre); // fermeture
?>
malheureusement je doute que ce bout de code ce prête bien à ce que je veux faire ou alors en partie, explode me semble approprié mais je manipule pas du tout cette fonction surtout dans ce contexte..

dans l'idée il me faut pouvoir récupérer les carractères de chaque ligne de 1 à 18 ainsi que ceux de 33 à 36 afin de stocker pour comparer dans une db sinon, comparer sans stocker c'est peut être aussi envisageable..

merci pour votre aide

Posté : 01 déc. 2005, 21:17
par mario
<?php
$fp = fopen('monfichier.txt', "rb"); // j'ouvre le fichier
while (!feof($fp)){ // tant que nous ne sommes pas à la fin du fichier
   $ligne = fgets($fp, 1024); // lecture de la ligne
   $tab = explode(" ",$ligne); // découpe la ligne
   /*
   //
   // voir doc sur explode et les tableaux php (array)
   //
   */   
}
fclose($fp); //fermeture du fichier
?>

Posté : 01 déc. 2005, 22:46
par mario
J'ai fait un exemple sur mon blog pour comprendre le fonctionnement des fichiers + tableaux.
Je suis ouvert à toute remarque et j'espère que ça pourra t'aider.

Posté : 02 déc. 2005, 16:00
par Yohann_06
J'ai fait un exemple sur mon blog pour comprendre le fonctionnement des fichiers + tableaux.
Je suis ouvert à toute remarque et j'espère que ça pourra t'aider.
Bonjour,

j'ai à partir de ton exemple fait une petite modif,
<?
$file = './xxxx.TXT'; // nom de mon fichier
$fp = fopen($file,'rb'); // ouverture du fichier
$tab = array(); // initialisation d'un tableau
while (!feof($fp)){ // tant que la lecture n'arrive pas au bout du fichier
 
$ligne = fgets($fp, 1024); // stocke le contenu de la ligne dans une variable
$ligne = trim(substr($ligne,0,36));
// $ligne = trim($ligne); // supprime les espaces en début et en fin de chaine
$taille = strlen($ligne); // calcule la taille de la chaine en nbr de caractère
 
if ($taille != 0){// si la taille de la chaine est différente de 0

/* on aurait pu aller plus loin dans la condition
// if ($taille != 0 && substr_count($ligne,'_') == 2)
// substr_count compte ici le nombre de _ dans la ligne
*/

$tab[]= explode(" ",$ligne); // stocke le contenu dans un tableau
}
}

fclose($fp); // ferme le fichier

$nbr_Enregistrement = count($tab); // nombre d'enregistrements dans le tableau

sort($tab); // tri par ordre alphabétique

/*
ksort($tab,2); // tri par prix ordre croissant
... il existe toutes les possibilités de tri
*/

// rien que pour l'essai, un affichage du tableau

echo '<pre>';
print_r($tab);
echo '</pre>';
?>
celà affiche les carractères de 0 à 36 partie qui m'intéresse,

Code : Tout sélectionner

Array ( [0] => Array ( [0] => 8V6176178426400COL [1] => COMMANDES [2] => N° [3] => 1108 ) [1] => Array ( [0] => 8V6176178427100COL [1] => COMMANDES [2] => N° [3] => 1116 ) )
mais j'aimerai pouvoir récupérer uniquement ([0] et [3]) comme dans ton 1er exemple et si possible sans afficher Array sans ([1] et [2])..

merci de ton aide

Posté : 02 déc. 2005, 16:50
par mario
j'aimerai pouvoir récupérer uniquement ([0] et [3]) comme dans ton 1er exemple et si possible sans afficher Array sans ([1] et [2])..

remplace:

Code : Tout sélectionner

echo '<pre>'; print_r($tab); echo '</pre>';
par un affichage de type tableau html:
echo "<table border='1'>
<tr><th>Référence</th><th>Numéro de commande</th></tr>";

$i=0;
while(isset($tab[$i])) // parcours du tableau $tab à l'aide d'une boucle
{
    echo "<tr><td>".$tab[$i][0]."</td><td>".$tab[$i][3]."</td></tr>";
    $i++;

}

echo "</table>";
sache que l'utilisation d'expression régulière peut etre utile pour être sur d'extraire les bonnes informations grace à un masque.

Posté : 02 déc. 2005, 17:24
par Yohann_06
Re Mario,
<?
$file = './CC-Expeditor-In-01.TXT'; // nom de mon fichier
$fp = fopen($file,'rb'); // ouverture du fichier
$tab = array(); // initialisation d'un tableau
while (!feof($fp)){ // tant que la lecture n'arrive pas au bout du fichier
 
$ligne = fgets($fp, 1024); // stocke le contenu de la ligne dans une variable
$ligne = trim(substr($ligne,0,36)); // carractères de 0 à 36
$taille = strlen($ligne); // calcule la taille de la chaine en nbr de caractère
 
if ($taille != 0){ // si la taille de la chaine est différente de 0

/*
on aurait pu aller plus loin dans la condition
// if ($taille != 0 && substr_count($ligne,'_') == 2)
// substr_count compte ici le nombre de _ dans la ligne
*/

$tab[]= explode(" ",$ligne); // stocke le contenu dans un tableau
}
}

fclose($fp); // ferme le fichier
$nbr_Enregistrement = count($tab); // nombre d'enregistrements dans le tableau
sort($tab); // tri par ordre alphabétique

/*
ksort($tab,2); // tri par prix ordre croissant il existe toutes les possibilités de tri
*/

echo "<table border='1'> 
<tr>
<th>Référence</th>
<th>Numéro de commande</th>
</tr>"; 

$i=1; 
while(isset($tab[$i])){ // parcours du tableau $tab à l'aide d'une boucle
echo "<tr>
<td>".$tab[$i][0]."</td>
<td>".$tab[$i][3]."</td>
</tr>"; 
$i++; 
} 
echo "</table>";
?>
j'ai homis de préciser dans mon fichier .TXT qu'il y a une ligne avec les entêtes séparées par des ";", pour ne pas prendre en compte cette ligne je commence la boucle à $i=1;

maintenant je pense que pour faire une update de ma db je pourrai utiliser,

Code : Tout sélectionner

$ref = $tab[$i][0]; $noCommande = $tab[$i][3]; tep_db_query("update order set ref = '".$ref."' where order_id = '".$noCommande."'");
merci bcp

Posté : 02 déc. 2005, 17:43
par mario
j'ai homis de préciser dans mon fichier .TXT qu'il y a une ligne avec les entêtes séparées par des ";", pour ne pas prendre en compte cette ligne je commence la boucle à $i=1;
Je te conseille de ne pas du tout prendre en compte cette ligne grâce à

Code : Tout sélectionner

if ($taille != 0 && substr_count($ligne,';') == 0)
:arrow: si il y a au moins 1 caractère et si ; n'est pas présent

Posté : 05 déc. 2005, 15:18
par Yohann_06
j'ai homis de préciser dans mon fichier .TXT qu'il y a une ligne avec les entêtes séparées par des ";", pour ne pas prendre en compte cette ligne je commence la boucle à $i=1;
Je te conseille de ne pas du tout prendre en compte cette ligne grâce à

Code : Tout sélectionner

if ($taille != 0 && substr_count($ligne,';') == 0)
:arrow: si il y a au moins 1 caractère et si ; n'est pas présent
merci bcp Mario