Aller au contenu

Sujets conseillés

Posté

Bonjour, après'm pluvieuse,

Deux questions dans ce post. Tout d'abord, est-il possible de stopper le process d'une boucle de lecture, si une certaine valeur est dépassée ? Par là, j'entends

If ($cpt > 5000) exit;

Deuxièmement, j'ouvre et lis un fichier texte. Chaque ligne du texte correspond aux valeurs de champs d'une bdd. Mais certaines valeurs ne m'intéressent pas. Comment les exclure, afin de ne conserver que celles voulues ?

je lis le fichier ainsi:

	$tableau = file($fichier);
while(list($cle,$val) = each($tableau))
{
 $tab = explode(",",$val);
 foreach ($tab as $cle => $valeur)
 print "tab=". $tab[$cle] ."<br>";

}

Merci de vos réponses,

xpatval

Posté (modifié)
If ($cpt > 5000) exit;

Je préférerais ce genre de condition de boucle, vu que ta boucle initiale dépend déjà d'une condition :

while($cpt <= 5000)

A joidre par un && à une autre condition dans la boucle initiale ... mais si tu nous donnes un cas plus précis tu auras une réponse plus précise ;)

Pour ta deuxième question, il te suffit de déterminer quelles lignes ne te dont pas nécessaires et je suppose que cela sera en fonction de leur contenu...et au vu du manque de détails sur la natures des données je peux te donner déjà ceci :

$tableau = file($fichier);
while(list($cle,$val) = each($tableau)) {
 $tab = explode(",",$val);
 foreach ($tab as $cle => $valeur) {
   if(strpos("le contenu que tu ne veux pas",$valeur) === false) {
     print "tab=". $tab[$cle] ."<br>";
   }
 }
}

Remplace la fonction "strpos" parce une autre fonction de "recherche", par exemple une fonction se basant sur les expressions régulières (preg_match, ergi, ...)...

Modifié par TheRec
Posté

En fait, chaque ligne du fichier doit comprendre environ 500 champs (donc, dans mon cas, séparés par une virgule). Mais seulement 10 ou 15 champs m'intéressent. Je souhaite donc les écrire après lecture dans une bdd réduite.

J'ai donc une quantité de champs à exclure...

xpatval

Posté (modifié)

C'est bien ce que je dis..si tu nous donnes la structure de ta table (le nom de chaque champ, et que tu nous donnes un aperçu de quelques lignes de ce(s) fichier(s) texte cela nous aidera énormément à mon avis...

Une piste serait peut être de simplement séparer ta ligne du fichier texte ($valeur) en un tableau avec la fonction split et de ne prendre que les index qui te sont nécessaires... et ensuite libérer la place utilisée par le tableau issu de split (avec unset)...Cela ne fonctionne que si nous parlons d'une fichier texte avec des champs délimités (par un ";" par exemple)... sinon tu peux avoir un fichier texte avec une largeur fixe de champ, tu devrait pouvoir te débrouiller avec les fonctions de base des chaînes de caractères... et en dernier ressort un fichier n'ayant pas de particulatiré pour séparer les champs...dans ce cas bon courrage... :lol:

Modifié par TheRec
Posté

C'est bien un fichier texte dont les valeurs sont délimintées par une virgule.

Code,Designation,CodeFam,BarCode,PxAchat,EPxAchat,PxRevient,EPxRevient,PxVenteHT

,PxVenteHT1,PxVenteHT2,PxVenteHT3,PxVenteHT4,EPxVenteHT0,EPxVenteHT1,EPxVenteHT2

EPxVenteHT3,EPxVenteHT4,Coeff0,Coeff1,Coeff2,Coeff3,Coeff4,CodeTVA0,CodeTPF,Coli

age,Conditionnement,PoidsUnite,volumeUnite,SeuilReappro,NiveauSecurite,CodeFourn

MultipleReappro,CodeRemise,CodeUnite,Nomenclature,CodeRemplacement,Localisation,

ateCreation,OperandeDevise0,OperandeDevise1,OperandeDevise2,OperandeDevise3,Date

odif,HeureModif,TVAAchat,Entrees.Qte,Entrees.Valeur,Sorties.Qte,Sorties.Valeur,C

mCli.Qte,ComCli.Valeur,ComFrn.Qte,ComFrn.Valeur,CpteFrance0.Achat,CpteFrance0.Ve

te,CpteFrance1.Achat,CpteFrance1.Vente,CpteFrance2.Achat,CpteFrance2.Vente,CpteF

ance3.Achat,CpteFrance3.Vente,CpteFrance4.Achat,CpteFrance4.Vente,CpteFrance5.Ac

at,CpteFrance5.Vente,CpteFrance6.Achat,CpteFrance6.Vente,CpteFrance7.Achat,CpteF

ance7.Vente,CpteFrance8.Achat,CpteFrance8.Vente,CpteFrance9.Achat,CpteFrance9.Ve

te,CpteCee.Achat,CpteCee.Vente,CpteExport.Achat,Cpte.....etc...

Ca, ça n'est qu'une partie de la première ligne du fichier, comportant les noms des champs de la table de la bdd d'origine, à partir de laquelle un extract des données est fait.

Les valeurs suivent donc, pour un fichier de 10 mo, dans ce genre:

1 C 3478,1 Centime Dupré 1848 A - Gad 84 - TTB,PIEFRA,,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,0,0,0,,0,,,,,,02/05/2005,1,0,0,0,02/05/2005,15:07:07:37,0,0,0,0,0,0,0,0,0,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,

0,60,70,60,70,60,70,60,70,0,0,0,0,1,,0x00000000,,0,,0,0,0,,,,0,0,0,0,0,0,0,0,0,0

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,0,0,0,Non,Non,,,,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,

,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

0,Gramme,0,0,Simple,PIEFRA,pieces France,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,70,60,70,N

n,Non,Non,Non,Non,0,0,0,0,0,0,0,1,1,1,1,1,,,1,Non,Non,Oui,Oui,Oui,2,0,2,0,2,0,1,

,0,0,0,Non,Non,,,,,,,Non,Non,,,,,,,Non,0,0,0,,,,,0,0,0,0,,Non,,,,,0,0,0,,,00:00:

0:00,,,,,,,,,,,,,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,00:00:00:00

,,,,0,,0,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

,0,0,0,0,0,0,0,0,,,,....etc....

La table destinataire ne comportera qu'une dizaine de champs. Disons, les 10 premiers.

Posté (modifié)

D'après ce que j'ai compris voilà un bout de code qui pourrait t'aider :

$lines = file($filename);
// On sort la premier ligne du tableau (la liste des champs) et on en fait un tableau
$fields = split(",",array_shift($lines));
// Liste des champs a conserver, on utilisera les id du tableau...on peut faire autrement mais c'est plus dur
$fieldsToKeep = array(0,1,2,3,4,5,6,7,8,9);

foreach($lines as $key => $line) {
 // Séparer la ligne en cours en un tableau contenant les valeurs
 $fields_val = split(",",$line);
 // Passer chaque valeur en revue et déterminer si elle fait partie d'un champ a conserver
 foreach($fields_val as $field_key => $val) {
   if(in_array($field_key,$fieldsToKeep) !== false) {
     echo "Ligne ".$key." : ".$fields[$field_key]."->".$val."<br />";
     // Ici, à la place d'afficher, tu crées ta requête SQL pour la ligne en cours
   }
 }
 unset($fields_val);
 // Ici tu effectues ta requête pour insérer tes données (celle de la ligne en cours) dans la base
}

C'est pas joli, il y a plus efficace mais ça reste assez simple a comprendre et j'ai pondu ça en 5 minutes ... je n'ai pas vraiement plus de temps a consacrer à cela désolé :(

Modifié par TheRec

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...