[RESOLU] comparaison de csv avec php

Petit nouveau ! | 5 Messages

27 nov. 2015, 12:23

Bonjour je suis actuellement entrain d'essayer de coder un programme php afin de comparer deux fichier csv en fonction d'une colonne commune.
J'arrive sans problème a récupérer mes deux tableau en fonction de cette colonne mais je n'arrive pas a trouver comment écrire la boucle me permettant de les comparés.
Je me demandais donc si quelqu'un ici n'aurais pas une aide miracle a m'apporter car je n'ai pas envie de devenir chauve a force de m'arracher les cheveux sur ce code.
Je vous met ici le code que j'ai réaliser :

Code : Tout sélectionner

/*---------- DEFINITION DE LA FONCTION ----------*/ // on cree la fonction function recupcsv($nomfichier) { $array = array(); // On cree un tableau $recupfichier = fopen($nomfichier , "r"); // Ouverture d'un fichier if ($recupfichier) { // On test la fin du fichier while (!feof($recupfichier)) { $data = fgetcsv($recupfichier , 0 , ';' , '"' ); // Recuperation des donnees du csv if ( empty($data)) continue; // Donnee vide //CONTINUE: structure de controle $id=$data[3]; $array[$id]=$data; // On met les valeur dans le tableau } fclose($recupfichier); // On ferme le fichier } else { throw new Exception("erreur de lecture du fichier $nomfichier"); // On lance une exception(fichier incorrecte) } return $array; // On conserve notre tableau } /*---------- LANCEMENT DU PROGRAMME ----------*/ /*echo $var = (expression vérifiée) ? affiche valeur 1 si test vérifié : affiche valeur 2 si test non vérifié; $mavar = ($test ? $vrai : $faux) SIGNIFIE if($test)$mavar = $vrai else $mavar =$faux if( isset($_REQUEST['f1']) ){ $nomfichier1 = $_REQUEST['f1']; } else { $nomfichier1 = 'frais.csv'; } if( isset($_REQUEST['f2']) ){ $nomfichier1 = $_REQUEST['f2']; } else { $nomfichier1 = 'frais2.csv'; } */ $nomfichier1=isset($_REQUEST['f1'])?/*$_REQUEST['f1']*/:'frais.csv'; // On rentre le nom du premier fichier $nomfichier2=isset($_REQUEST['f2'])?/*$_REQUEST['f2']*/:'frais2.csv'; // On rentre le nom du second fichier if ( !$nomfichier1 ) { die("Il me faut le premier fichier (f1)"); }// On verifie la presence du premier fichier if ( !$nomfichier2 ) { die("Il me faut le second fichier (f2)"); }// On verifie la presence du second fichier try { $tabfichier1 = recupcsv($nomfichier1); // On lance la fonction cree precedement sur le premier fichier $tabfichier2 = recupcsv($nomfichier2); } catch (Exception $e) { // On recupere les exception dans une variable e die($e->getMessage()); // On demande d'afficher le message destinée au exception } print_r($tabfichier1); print_r($tabfichier2);
N’hésiter pas a me demander plus de renseignement si cela vous semble utile je reste également ouvert a toute remarque sur d’éventuelle remarque sur le code existant.

Mammouth du PHP | 1967 Messages

27 nov. 2015, 12:58

Moi je bouclerai avec un foreach sur un des deux tableaux, en cherchant dans l'autre si il y a le même id. ensuite tu fait ta comparaison
Si tu ne cherche que les ligne comune, cela suffit sinon il faut aussi boucler sur ton 2ème tableaux. Si tes tableaux sont grand, il peut être utile d'éviter de refaire la même chose 2 fois.

La bonne question à se poser: Que veux tu comme retour de ta comparaison.
Les lignes identiques ?
toutes les lignes des 2 tableaux sans doublon
les lignes avec le même id mais des valeurs différentes ?
...
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 5 Messages

27 nov. 2015, 13:08

Merci de ta réponse pour commencer donc le retour que j'aimerai serait de connaitre les lignes valeur qui ne vont pas matcher. Les deux csv qui vont être comparer sont des base de donnée censé être identique car la seconde est la migration de la première ce que l'on veut c'est vérifier si la migration a été faite correctement et sans erreur.
Donc le retour idéal serait que se code me retourne les endroits ou il y a des erreurs avec l'endroit ou se trouve ces erreurs dans les deux document.

oui je sais sa fait beaucoup pour un débutant normalement je devrait bosser dessus avec mon patron mais il est pas mal occuper ailleurs en se moment donc j'essaie d'avancer de moi même comme je peut.
EDIT : merci de consacrer un peu de ton temps a mon problème et j’espère avoir éclaircie mon problème.

Mammouth du PHP | 1967 Messages

27 nov. 2015, 13:28

Donc je te propose:
un foreach sur le premier tableau,
tu vérifie la présence de la même clé dans le 2ème
sinon, tu affiche la ligne ou la stock dans un tableaux d'erreur pour traitement ultérieur
si tu trouve correspondance, tu vérifie la correspondance de chaque champ entre tes 2 lignes.
Si tout concorde, tu supprime de ton 2ème tableaux grace à l'index unset($deuxieme_tableaux[$index])
si un ou plusieurs paramètre ne correspond pas, tu fait un affichage particulier montrant quelle champs est discordant
mais tu supprime aussi la ligne dans ton deuxième tableaux

Tu aura ainsi à la fin du parcours du premier tableaux un deuxième tableaux qui ne contiendrai plus que les enregistrement unique de ce tableaux.
Tu peux en faire ce que tu veux

Code que je garanti absolument pas sans erreur
foreach($tableaux1 as $cle => $val){
if (isset($tableaux2[$cle]) {
foreach($val as $index => $value) {
if ($value != $tableaux2[$cle][$index]) {
echo "ligne non concordante ".implode(" ",$val)." et  ".implode(" ",$tableaux2[$cle]);
unset($tableaux2[$cle]);
} else {//la ligne est identique
unset($tableaux2[$cle]);
}
}else{
echo "la ligne suivante est unique dans le tableaux 1 ".implode(" ",$val);
}}
foreach($tableaux2 as $cle => $val){
echo "la ligne suivante est unique dans le tableaux 2 ".implode(" ",$val);
}
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 5 Messages

27 nov. 2015, 15:06

merci c'est un bon départ pour moi même si je préférerai ne pas toucher au fichier mais plutôt que sa apparaisse sur une interface web ou sur un autre csv mais je vais chercher de mon coter comment faire. Ce n'est pas drôle si je vous laisse tout faire . en tous cas merci de ta réponse sa m'avance déjà dans la démarche au moins

Mammouth du PHP | 1967 Messages

27 nov. 2015, 16:15

le code ne touche pas aux fichier,
echo ne fait que retourner le texte au navigateur
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 5 Messages

27 nov. 2015, 16:37

oui je me suis rendu compte de l'immense bêtise que je disait en me relisant mais ce code me prend tellement la tête que je commence à avoir du mal à réfléchir

Petit nouveau ! | 5 Messages

30 nov. 2015, 15:04

J'ai réussit a trouver une solution qui m'affiche ce dont j'ai besoin. Elle affiche l'id des ligne présentant une différence ainsi que la valeur du premier fichier avec celle qui change dans le second fichier!

on a donc un resultat sous cette forme:

id=>colone=>valeur Fichier 2 || valeur fichier 1

10 => 0 => turlu || toto
3 => 5 => tare || tete

je laisse aussi le code que j'ai utiliser on ne sait jamais si cela peut aider quelqu'un a l'avenir.

Code : Tout sélectionner

/*---------- DEFINITION DE LA FONCTION ----------*/ // on cree la fonction function recupcsv($nomfichier) { $tabcsv = array(); // On cree un tableau $recupfichier = fopen($nomfichier , "r"); // Ouverture d'un fichier if ($recupfichier) { // On test la fin du fichier while (!feof($recupfichier)) { $valeur = fgetcsv($recupfichier , 0 , ';' , '"' ); // Recuperation des donnees du csv if ( empty($valeur)) continue; // Donnee vide //CONTINUE: structure de controle $key=$valeur[3]; $tabcsv[$key]=$valeur; // On met les valeur dans le tableau } fclose($recupfichier); // On ferme le fichier } else { throw new Exception("erreur de lecture du fichier $nomfichier"); // On lance une exception(fichier incorrecte) } return $tabcsv; // On conserve notre tableau } /*---------- LANCEMENT DU PROGRAMME ----------*/ $nomfichier1=isset($_REQUEST['f1'])?/*$_REQUEST['f1']*/:'frais.csv'; // On rentre le nom du premier fichier $nomfichier2=isset($_REQUEST['f2'])?/*$_REQUEST['f2']*/:'frais2.csv'; // On rentre le nom du second fichier if ( !$nomfichier1 ) { die("Il me faut le premier fichier (f1)"); }// On verifie la presence du premier fichier if ( !$nomfichier2 ) { die("Il me faut le second fichier (f2)"); }// On verifie la presence du second fichier try { $tabfichier1 = recupcsv($nomfichier1); // On lance la fonction cree precedement sur le premier fichier $tabfichier2 = recupcsv($nomfichier2); } catch (Exception $e) { // On recupere les exception dans une variable e die($e->getMessage()); // On demande d'afficher le message destinée au exception } /*print_r($tabfichier1); echo '</br>'; print_r($tabfichier2); echo '</br>'; */ foreach ($tabfichier1 as $key => $val){ while(list($key_det_1, $val_det_1)=each($val)){ if($tabfichier2[$key][$key_det_1] != $val_det_1) echo $key." => ".$key_det_1." => ".$val_det_1." || ".$tabfichier2[$key][$key_det_1]."<br>"; }
merci a ceux qui on prix le temps de s’intéresser a mon problème et on chercher a m'aider