Traitement de fichier en php

cs_daris Messages postés 49 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 17 février 2009 - 3 janv. 2008 à 16:28
cs_seybou Messages postés 3 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 6 octobre 2009 - 6 oct. 2009 à 20:04
Bonjour,
 J'ai un fichier sous ce format
14366,1,56.9,704,0.411326   
14366,2,56.2,703,0.0322821   
14366,3,57.5,688,0.181508   
14366,4,57.6,687,0.599771   
14366,5,59.1,669,0.274231   
14366,6,60.1,657,0.173746*
14360,1,56.9,704,0.411326   
14360,2,56.2,703,0.0322821   
14360,3,57.5,688,0.181508   
14360,4,57.6,687,0.599771   
14360,5,59.1,669,0.274231   
14360,6,60.1,657,0.173746*   
14359,1,56.9,704,0.411326   
14359,2,56.2,703,0.0322821   
14359,3,57.5,688,0.181508   
14359,4,57.6,687,0.599771   
14359,5,59.1,669,0.274231   
14359,6,60.1,657,0.173746*
14372,1,56.9,704,0.411326   
14372,2,56.2,703,0.0322821   
14372,3,57.5,688,0.181508   
14372,4,57.6,687,0.599771   
14372,5,59.1,669,0.274231   
14372,6,60.1,657,0.173746
deux type de separateur ,(virgule) et *(etoile)

Pour traiter ce ffichier avec du php, je veux dans un premier temps  separer les donneés en bloc grace au separateur (*)
Ensuite traiter chaque bloc en prenant en compte le separateur (,)

mais je suis bloquée au niveau de la premiere étape= > separation en bloc /separateur *

Voici mon script:
$ouvre = fopen ($uploadfile,"r"); // ouverture fichier en lecture "r"
                                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 " Ce fichier contient ",$combien," données :

";
                                   
                                    for ($i =0;$i<=$combien;$i++)
                                        {
                                    echo $donnee[$i],"
";  // affichage des données
                                        }
                               
                                }

ce script ne me permet pas de faire ce que j'ai decris plus haut car dans un bloc il ya plusieurs lignes.
Si vous avez une idée pour m'aider .Merci d'avance

7 réponses

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
3 janv. 2008 à 17:13
PAS TESTE!



$filename = 'le nom de ton fichier';
$handle = fopen($filename,"rb");
$content = fread($handle, filesize($filename));
fclose($handle);

$split = explode('*',$content);
echo 'Ce fichier contient '.count($split).' éléments :

';
for ($i=0;$i<count($split);$i++)
    echo 'Block '.$i.' : '.$split[$i].'
';






*****
noisy communication - wherever, be everywhere!
0
yoman64 Messages postés 962 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 2 août 2010 2
3 janv. 2008 à 23:13
Salut,

quelques petites corrections:

$content=
file_get_contents($uploadfile);  // Beaucoup plus rapide que fread (confirmé par la doc php)

$split = explode('*',$content);
echo 'Ce fichier contient '.count($split).' éléments séparé par une étoile:

';
$nbr=
count($split); // Faut jamais mettre un count dans une boucle

for ($i=0;$i<$nbr;$i++)

    echo 'Block '.$i.' : '.$split[$i].'
';







-------------------
Vous cherchez un hebergement Php/MySQL Gratuit et sans publicités ??
Et bien c'est la : www.e3b.org  
0
cs_daris Messages postés 49 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 17 février 2009
4 janv. 2008 à 08:53
Merci pour vos aides , ca marche bien ce script et ca fait exactement ce que je voulais  mais malheureusement je doit proceder autrement maintenant . c'est dire que je n'ai plus de séparateur * dans mon fichier .le delimiteur de chaque block doit être la premiere colonne du fichier csv qui est un identifiant.
pour chaque identifiant je doit lire le block et inserer les resultat dans ma base ansi de suite. si vous avez une idée .Merci de ne pas hesiter
0
cs_daris Messages postés 49 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 17 février 2009
4 janv. 2008 à 10:42
Je rexplique mon probleme :
j'ai ce fichier dont la première colonne correspon a un identifiant.:
14366,1,56.9,704,0.411326   
14366,2,56.2,703,0.0322821   
14366,3,57.5,688,0.181508   
14366,4,57.6,687,0.599771   
14366,5,59.1,669,0.274231   
14366,6,60.1,657,0.173746
14360,1,56.9,704,0.411326   
14360,2,56.2,703,0.0322821   
14360,3,57.5,688,0.181508   
14360,4,57.6,687,0.599771   
14360,5,59.1,669,0.274231   
14360,6,60.1,657,0.173746 
14359,1,56.9,704,0.411326   
14359,2,56.2,703,0.0322821   
14359,3,57.5,688,0.181508   
14359,4,57.6,687,0.599771   
14359,5,59.1,669,0.274231   
14359,6,60.1,657,0.173746
14372,1,56.9,704,0.411326   
14372,2,56.2,703,0.0322821   
14372,3,57.5,688,0.181508   
14372,4,57.6,687,0.599771   
14372,5,59.1,669,0.274231   
14372,6,60.1,657,0.173746
Pour chaque identifiant je doit lire toutes les ligne et les  rajouter dans un tableau que je vais traiter apres pour inserer dans ma base.
J'ai essaye de mettre en place le script  ci dessous , peut être pas trop coherent car par manque d'expérience je ne suis pas convaincu de mon algorithme. merci si vous pouvez m'eclaicir.

$row = 1; // initialisation de la 1ère ligne du fichier uploadé
$fp= fopen ($uploadfile,"r"); // ouverture fichier en lecture "r"
$identifiant =null;    
while ($data = fgets ($fp, 4086)){         //$contentfile_get_contents($uploadfile);                                              list($no_analyse_B_ARISA,$numero_de_bande,$intensite_de_la_bande,$taille_de_la_bande,$distance_de_migration) explode(",", $data);
$identifiant=$no_analyse_B_ARISA;                
 echo $identifiant;
 $num = count ($data);
            for($i=0; $i < $num; $i++){
                          if($identifiant == $no_analyse_B_ARISA){
                                    echo "je suis à la ligne numero ".$row."du fichier
";   
                           }else{
                                    echo "Attention l'dentifiant a changer!
";
                            }
                                    
                }
$row++;   
 print_r($data);
 fclose($fp);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
4 janv. 2008 à 10:54
yoman64 où est-il dit que file_get_contents est plus rapide? Ca m'intéresse! Je n'ai pas trouvé sur http://fr.php.net/file_get_contents...

*****
noisy communication - wherever, be everywhere!
0
yoman64 Messages postés 962 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 2 août 2010 2
4 janv. 2008 à 15:36
Salut,
C'est dans la page de la doc de fread : http://ca.php.net/manual/fr/function.fread.php

Note:

Si vous voulez lire le contenu d'un fichier dans une chaîne de
caractères, utilisez plutôt file_get_contents()
qui est bien plus rapide que le code ci-dessus.


Mais je suggère ce changement surtout parce que je crois que ça fait plus propre de remplacer 3 lignes par une seule fonction qui est faite pour ça :).

-------------------
Vous cherchez un hebergement Php/MySQL Gratuit et sans publicités ??
Et bien c'est la : www.e3b.org  
0
cs_seybou Messages postés 3 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 6 octobre 2009
6 oct. 2009 à 20:04
bonsoir,moi j'ai plutot un repertoire dans lequel se trouve plusieurs repertoires dont
1.je doit recuperer le nom de chacun des ces répertoires dans un parametre;
2.pour chaque repertoire je doit rechercher, identifier et compter les fichiers de meme type: dont les noms ont en commun une chaine xxxx;
3.ouvrir chaque fichier
4.Identifier et lecture des informations utiles (ici en bleu) avec creation d'une table dont les colonnes sont en rouges:
Name of BSC : AGA
begin date and time : 2009-07-17 11:00
end date and time : 2009-07-17 12:00
LINK_ID C153A C153B C251 C252 C253 C254 C255 C256 C257 C258
16 0 1 0 165 2324 0 0 2353 0 0
144 0 0 0 198 2323 0 0 2313 0 0
272 0 0 0 202 2326 0 0 2309 0 0

5.inserer pour chaque ligne les colonnes suivantes jusqu'à rencontrer une ligne vide:
Name of BSC begin date and time end date and time LINK_ID C153A ... C256

6.sortir du fichier si rencontre ligne vide et ouvrir le prochain fichier. et faire le processus en ajoutant les nouvelles valeurs pour les memes colonnes.

Merci de m'aider à faire un code PHP/Mysql de cet algorithme.
merci d'avance !
0
Rejoignez-nous