Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
882 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  import, traitement, conversion, opération sur fichier texte .txt

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

import, traitement, conversion, opération sur fichier texte .txt

n°2024454
cdev
Posté le 22-09-2010 à 12:56:26  profilanswer
 

Bonjour, je suis en formation et je bloque sur un problème malgré mes recherches sur plusieurs forums
 
 
J'ai un fichier "source.txt" qui comtient les lignes suivantes :
ligne1compteA000100
ligne2compteB000200
ligne3compteB000300
ligne4compteC001000
 
il se lit comme ça :
la "ligne 1" référence le "compteA" pour un montant de "000100"
la "ligne 2" et la "ligne3" référencent toutes les deux le "compteB" pour 2 montants respectivement "000200" et "000300"
la "ligne 4" référence le "compteC" pour un montant de "001000"
 
Je doit fournir après conversion un fichier "destination.txt" qui sera sous cette forme :
ligne1compteA000100
ligne2compteB000500
ligne3compteB000200
ligne4compteB000300
ligne5compteC001000
 
En fait :
si un compte apparait plusieurs fois, je doit effectuer le calcul des montants et écrire une ligne supplémentaire  avec la somme sur une ligne avant de ré-écrire ensuite chacune des lignes originales ayant servies au calcul
Si un compte n'apparait qu'une fois je ré-écrit la ligne telle quelle.
 
J'ai commencé avec ce script :
 
<code>
// ouverture du fichier source :
// nom du fichier :
$fichier="source.txt";
// emplacement :
$open_fichier = fopen($fichier,"r" );
// lecture par ligne :
$lines = file('source.txt');
 
// pour séparer les données sans séparateur, j'utilise la fonction substr avec des position et des longueurs que je défini au préalable :
$position_ligne = '0';
$longueur_ligne = '6';
 
$position_compte = '7';
$longueur_compte = '7';
 
$position_montant = '14';
$longueur_montant = '6';
 
// ensuite je lance ma boucle de lecture :
 
// initialisation d'un compteur :
$i=0;
// tant qu'il y une ligne dans le fichier source :
while($ligne=fgets($open_fichier,100000000))
{
 // enregistrement de la première valeur de chaque ligne :
 $src_ligne[$i] = substr($lines[$i], $position_ligne, $longueur_ligne);
 // enregistrement de la première valeur de chaque ligne :
 $src_compte[$i] = substr($lines[$i], $position_compte, $longueur_compte);
 // enregistrement de la première valeur de chaque ligne :
 $src_montant[$i] = substr($lines[$i], $position_montant, $longueur_montant);
 
 // écriture du fichier de destination :
 // definition du nom du fichier :
 $fichier_dest="destination.txt";
 // ouverture du fichier :
 $fichier_ouvert = fopen($fichier,"a" );
 // verrouillage du fichier :
 flock($fichier_ouvert,2);
 // ecriture :
 fwrite($fichier_ouvert, "\n".$src_ligne[$i] .$src_compte .$src_montant);
 // déverouillage du fichier :
 flock($fichier_ouvert,3);
 // fermeture
 fclose($fichier_ouvert);
 // incrémentation :
 $i++;
}
</code>
 
J'arrive ainsi à générer le fichier de destination (dans cet exemple c'est un clone de la source mais en réalité les positions changent pour chaque valeur et des informations sont ajoutés en fonctions de différents tests)
 
Comment est-ce que vous vous y prendriez pour détecter les comptes en doublons, stocker les montants correspondants, faire la somme et écrire une ligne avec cette somme avant de ré-écrire chacune des lignes ayant servies au calcul ?
Merci d'avance si vous trouver le temps de m'indiquer des pistes ou des exemples !

mood
Publicité
Posté le 22-09-2010 à 12:56:26  profilanswer
 

n°2024538
roondar
Posté le 22-09-2010 à 17:17:40  profilanswer
 

Je sais pas si ca peut t'aider mais je me baserais pas sur l'index d'un élément mais plutôt avec une regex pour séparer les differents champs du style s/^.*(ligne[0-9]+)(compte[A-Z]+)([0-9]+).*$/\1 \2 \3/g' que je mettrais dans un tableau et un coup array-unique devrait l'affaire.
Enfin je donne une piste !


Message édité par roondar le 22-09-2010 à 17:20:50
n°2024539
cdev
Posté le 22-09-2010 à 17:21:51  profilanswer
 

Merci pour la réponse.
Je ne contredis pas la possibilité d'utiliser une regex
Par contre les positions peuvent bouger et il me parait plus facile des les mettre à jour en utilisant des index stockés dans des variables.
Ce dont j'ai besoin de trouver maintenant c'est le tableau qui ira bien pour stocker mes valeurs en doublons et les calculer (tableau à l'intérieur de ma boucle ou plus en amont ?)


Message édité par cdev le 22-09-2010 à 17:22:23
n°2024540
stealth35
Posté le 22-09-2010 à 17:58:35  profilanswer
 

faut faire ca en 2 temps : lire et traiter  + ecrire
la tu met tout dans la même boucle
et utilise file c'est quand meme plus simple

n°2024541
cdev
Posté le 22-09-2010 à 17:59:10  profilanswer
 

Merci pour la réponse

n°2024575
czh
Posté le 22-09-2010 à 20:54:21  profilanswer
 

Je sais pas si ça marche mais une version regex ça ressemblerait à ça :  

Code :
  1. $comptes = array();
  2. // pour chaque $ligne
  3. // syntaxe PHP5.1: foreach(new SplFileObject($open_fichier) as $ligne)
  4. {
  5.   preg_match("/^(.{{$longueur_ligne}})(.{{$longueur_compte}})(.{{$longueur_montant}})\$/", $ligne, $matches);
  6.   list(,$noligne, $nocompte, $montant) = $matches;
  7.   if (!isset($comptes[$nocompte])) $comptes[$nocompte] = array(); // facultatif
  8.   $comptes[$nocompte][$noligne] = $montant;
  9. }
  10. // fin pour chaque $ligne
  11. foreach ($comptes as $nocompte => $montants) {
  12.   $total = array_sum(array_values($montants));
  13.   // écrire ce que tu veux dans fichier de résultat
  14. }


Message édité par czh le 22-09-2010 à 21:18:11

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  import, traitement, conversion, opération sur fichier texte .txt

 

Sujets relatifs
Upload de fichier Strutsimport scripts / __import__
Suppression fichierAjouter au dernier ipod nano 6G un lecteur de texte
Afficher texte sur une image au passage de la sourisCompiler un fichier .py en .pyc
Programme C++ / ecriture de fichier Access / 'ConflictTables'Ecire et remplacer caractère dans un fichier txt
[OpenOffice macro] publipostage avec un fichier txt externe 
Plus de sujets relatifs à : import, traitement, conversion, opération sur fichier texte .txt


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR