IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Comparaison de fichier CSV code php


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Comparaison de fichier CSV code php
    Bonjour,
    Voilà je dois réaliser un script php qui compare deux fichiers CSV et qui écrit les comparaisons dans un nouveau fichier CSV.
    EN GROS : J'ai un fichier A avec 240 produits et dans le fichiers 2 colonnes, 1 référence et 1 stock (Fichier de mon site).
    J'ai un fichier B (Fichier du fournisseur qui est mis à jour quotidiennement) avec idem 1 colonne référence et 1 colonne stock.
    J'aimerais savoir s'il était possible de créer un script PHP qui chercherais dans les deux fichiers si dans un premier temps la référence d'un produit A se trouve dans le fichier A et dans le fichier B puis ensuite de comparer les stocks et si jamais ce n'est pas les mêmes, dans ce cas, on écrit dans un fichier C la référence + le stock actuelle (Donc celui du fichier B).
    Ensuite si jamais il y a une référence dans le fichier B mais pas dans le fichier A j'aimerais également qu'il m'écrive cette différence dans le fichier C.
    En gros c'est dans le but d'actualiser mes stocks quotidiennement ainsi que d'entrer des nouveaux produits sans devoir chercher ligne par ligne les différences.
    Merci par avance pour votre aide.
    Pour le moment j'ai commencer à faire ce bout de code, mais il ne fonctionne pas comme j'aimerais .. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php 
     
    // 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']*/:'infosA.csv'; // On rentre le nom du premier fichier
    $nomfichier2=isset($_REQUEST['f2'])?/*$_REQUEST['f2']*/:'infosB.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>";
     
        }
     
    }
    ?>

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    comme t'es étudiant, tu vas être obligé de phosphorer un peu...
    Je t'invite déjà à reprendre la partie relative à l'acquisition des données du fichier csv selon cet exemple
    Ensuite dans tes comparaisons, liste d'abord tous les cas de figure et code en conséquence

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour,
    merci pour la réponse
    Rah ahah avec grand plaisir
    J'ai bien compris la doc. Ensuite je vais réorganiser mes fichiers CSV à comparer pour classer par ordre croissant des deux côtés, comme ça mon script comparera la ligne 1 avec la ligne 1 et si mes fichiers sont classés, théoriquement, il devrait donc comparer le stock par exemple d'un même produit
    Je suis sur la bonne voie ou pas du tout ?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par lacolyte Voir le message
    Ensuite je vais réorganiser mes fichiers CSV à comparer pour classer par ordre croissant des deux côtés, comme ça mon script comparera la ligne 1 avec la ligne 1 et si mes fichiers sont classés, théoriquement, il devrait donc comparer le stock par exemple d'un même produit
    Le mot le plus important dans cette phrase est théoriquement
    Donc en réalité tu peux laisser tomber cette approche, tu ne dois jamais faire confiance aux sources de données externes et encore moins à leur supposé ordonnancement.
    Ton code doit se débrouiller de manière à envisager tous les cas de figure, il doit être robuste et donc se contenter de récupérer deux fichiers csv à comparer. Tu dois t'assurer de leur conformité et répondre en conséquence la cas échéant.
    Bref, ne suppose rien, t'as pas de boule de cristal juste des outils et de la logique, c'est déjà énorme.

    Fais un flowchart du déroulé qui te parait le plus logique dans le traitement à faire et fais voir. C'est la base de tout bon algorithme (perso j'en ai bouffé des kilos, crois-moi)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Nom : Traitement cdiscount.png
Affichages : 865
Taille : 76,5 Ko

    Voilà, c'est ce que tu voulais que je face ?
    Dans ma tête EN GROS c'est ce que je veux faire (En vert cela signifie que c'est déjà fais et que ça fonctionne et en rouge c'est que c'est en cours de traitement)

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Il n'y a absolument pas nécessité de réécrire les fichiers csv. C'est la manière de les charger en mémoire qui compte. En gros ce qui est en vert et déjà codé et qui fonctionne ne sert à rien
    Poste voir un petit segment de chacun des deux fichiers sans aucune modif, stp.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Je les réécris de sorte à avoir en colonne 1 : les références et en colonne 2 : les stocks.
    En gros : Nom : a.png
Affichages : 840
Taille : 58,8 Ko Nom : b.png
Affichages : 857
Taille : 42,9 Ko
    Première image fichier A non modifier (Il y a en tout 15 colonnes) et idem pour la deuxième image fichier B.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ok, donc quand tu charges tes fichiers csv, tu dois te débrouiller pour arriver à avoir un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    $internal_stock = [
        'ref_product_1' => 5,
        'ref_product_2' => 1,
        'ref_product_3' => 8,
        'ref_product_9' => 1,
    ];
     
    $supplier_stock = [
        'ref_product_1' => 1,
        'ref_product_2' => 10,
        'ref_product_3' => 0,
        'ref_product_4' => 25,
        'ref_product_5' => 12,
    ];
     
    // pour n'avoir que les références avec quantité > 0
    $values = array_filter($internal_stock); //  ou array_filter($supplier_stock);
     
    // liste des références en stock et absents chez le fournisseur :
    $only_internal = array_diff_key($internal_stock, $supplier_stock);
     
    // liste des références chez le fournisseur et absents en interne :
    $only_supplier = array_diff_key($supplier_stock, $internal_stock);
     
    // analyse en tous sens
    $data = [];
    foreach ($internal_stock as $ref => $qty) {
        $data[$ref]['is_referenced_internally'] = true;
        $data[$ref]['internal_stock_qty']       = $qty;
     
        if (isset($supplier_stock[$ref])) {
            $data[$ref]['is_referenced_by_supplier'] = true;
            $data[$ref]['supplier_stock_qty']        = $supplier_stock[$ref];
            $data[$ref]['diff_stock']                = $supplier_stock[$ref] - $qty;    
        } else {
            $data[$ref]['is_referenced_by_supplier'] = false;
            $data[$ref]['supplier_stock_qty']        = null;
            $data[$ref]['diff_stock']                = null;
        }
    }
     
    foreach ($only_supplier as $ref) {
        $data[$ref]['is_referenced_internally']  = false;
        $data[$ref]['internal_stock_qty']        = null;
        $data[$ref]['is_referenced_by_supplier'] = true;
        $data[$ref]['supplier_stock_qty']        = $supplier_stock[$ref];
        $data[$ref]['diff_stock']                = null;
    }

  9. #9
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour bonjour,
    désolé j'ai mis du temps à réponndre :/ Je ne comprends pas trop le code que tu m'as passer enfin pas totalement :/
    En gros pour toi j'annule le faite de retravailler mes deux fichiers CSV c'est bien ça ?! Je travaille directement sur les fichiers de base ?
    Je n'ai vraiment pas compris cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // analyse en tous sens
    $data = [];
    foreach ($internal_stock as $ref => $qty) {
        $data[$ref]['is_referenced_internally'] = true;
        $data[$ref]['internal_stock_qty']       = $qty;
     
        if (isset($supplier_stock[$ref])) {
            $data[$ref]['is_referenced_by_supplier'] = true;
            $data[$ref]['supplier_stock_qty']        = $supplier_stock[$ref];
            $data[$ref]['diff_stock']                = $supplier_stock[$ref] - $qty;    
        } else {
            $data[$ref]['is_referenced_by_supplier'] = false;
            $data[$ref]['supplier_stock_qty']        = null;
            $data[$ref]['diff_stock']                = null;
        }
    }
     
    foreach ($only_supplier as $ref) {
        $data[$ref]['is_referenced_internally']  = false;
        $data[$ref]['internal_stock_qty']        = null;
        $data[$ref]['is_referenced_by_supplier'] = true;
        $data[$ref]['supplier_stock_qty']        = $supplier_stock[$ref];
        $data[$ref]['diff_stock']                = null;
    }
    Désolé je suis un peut long à la détente mais je suis débutant en php (2 mois de php :/)
    Merci pour ton aide !!!

  10. #10
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Nom : bug.png
Affichages : 851
Taille : 105,4 Ko

    Si on regarde bien j'obtiens ça : => 0 => S0421076 || S0222350
    => 1 => 18 || 0

    Le problème c'est que je comprends pas l'eereur, je ne comprends pas pourquoi il ne me fait qu'une seule ligne ?
    De plus, je souhaiterais qu'il compare par exemple la ref 45BERF qui à 10 en stocks avec la ref 45BERF qui à un stock actuelle de 45 et là boom il me récrit dans un nouveau fichier la ref 45BERF qui à un stock de 45, comme àa, en ouvrant le fichier dans lequel mon script aura écrit les différences, moi je vois que pour tel ref il y a tel stock donc ainsi je peux aller vérifier et faire une MAJ de mon stock sur mon site ou bien carrément, si la ref est unique et n'existe que dans le fichier du fournisseur, et bien ainsi je peux faire ma fiche produit pour rentrer le nouveau produit.

    Ça fait 10 jours que je cherche je cherche je cherche pour réaliser ce code .. En même temps je dois faire un site prestashop donc je ne devrais pas passer autant de temps sur ce script

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php 
     
    $separator = ';';
     
    // 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 , 4000 , ';' , '"' ); // 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']*/:'infosA.csv'; // On rentre le nom du premier fichier
    $nomfichier2=isset($_REQUEST['f2'])?/*$_REQUEST['f2']*/:'infosB.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){
     
        foreach($val as $key_det_1 => $val_det_1) {
          if($tabfichier2[$key][$key_det_1] != $val_det_1) echo $key." => ".$key_det_1." => ".$val_det_1." || ".$tabfichier2[$key][$key_det_1]."<br>";
     
        }
     
    }
     
    ?>
    Merci beaucoup d'avance pour ton aide !

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par lacolyte Voir le message
    Ça fait 10 jours que je cherche je cherche je cherche pour réaliser ce code .. En même temps je dois faire un site prestashop donc je ne devrais pas passer autant de temps sur ce script
    Là où tu bosses, t'as personne pour te coacher quand tu bloques ?
    Parce que te le faire ça pique

  12. #12
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Ben en gros mon patron n'a pas de connaissance en dev, son dev est partie et ducoup il m'a prit en stage pour que je l'aide.
    Donc non là comme ça, je suis seul au monde
    C'est pour ça que je viens demander de l'aide parce je suis grave en galère ..
    Mais oui je comprends aussi ta position pas de problème
    Merci déjà pour tout !

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    ah la la, les joies du "on va prendre un stagiaire pour le taf d'un dev, c'est juste un site web, ce devrait aller"
    ça viendrait à personne de dire "bon on va prendre un stagiaire pour construire le toit de la maison, c'est juste des tuiles" ou "L'infirmière est en congés maladie, prenons un stagiaire, c'est juste des piqures après tout"

    Pour ton problème de lignes, question bête : est-ce que tu as vérifié le type de retour à la ligne dans ton fichier ? Genre si ton script tourne sur un serveur Unix et que les retours à la ligne sont des retours "\r\n" au lieu "\n".
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

Discussions similaires

  1. [CSV] Créer un fichier CSV en PHP
    Par reedbedroom dans le forum Langage
    Réponses: 2
    Dernier message: 01/04/2009, 14h10
  2. Importer un fichier .csv avec php et PDO
    Par Touny dans le forum Langage
    Réponses: 6
    Dernier message: 05/03/2009, 17h45
  3. Réponses: 1
    Dernier message: 10/01/2008, 13h52
  4. [CSV] Créer un fichier csv depuis php
    Par jbidou88 dans le forum Langage
    Réponses: 5
    Dernier message: 07/05/2007, 17h41
  5. [CSV] Fichier CSV en PHP
    Par rimeh dans le forum Langage
    Réponses: 1
    Dernier message: 11/01/2007, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo