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

Langage PHP Discussion :

Traiter un fichier CSV


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 6
    Par défaut Traiter un fichier CSV
    Bonjour,

    j'ai cherché sur le net mais je n'ai pas trouvé ce que je voulais ( peut-être mal cherché.., je m'excuses si tel est le cas )
    Je dois établir un tableau et le remplir avec les données contenus dans un fichier csv que j'ai reçu.

    Je fais une requête AJAX qui va chercher mon script php, qui lui lis le CSV en question(a noter que pour l'instant j'éssaye juste de retirer mon information précise dans une div pour faire des test).

    Alors voila je ne sais pas trop quel outil peut m'aider à extraire une ligne précise a l'aide d'une variable par exemple et a prendre les informations que je demande sur cette même ligne..

    La structure du fichier CSV est :

    103|053439|3 |STELLA ART 24X25CL |013,95|192601|PILS-CASIERS |1|0001|1 .
    103|043695|5 |KARLPILS 24X25CL -VC- |004,59|192601|PILS-CASIERS |1|0001|1 .

    voici la partie HTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <button id="test"></button>
    <div id="data"></div>
    la partie Javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Requete pour lire le referentiel d'article.
    $("#test").tap(function(){
        $.ajax({
            url: "***/ReadArticleInCSV.php",
                  type: 'GET',
                  async: false,
     
                  success: function(data) {  
                  //alert(data);  
                  //  $("#data").append(data);
                  }
        });
    });
    et la partie PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $file = file_get_contents("../ref_103.csv");
    $data = array_map("str_getcsv", preg_split('/\r*\n+|\r+/', $file));
    print_r($data);
    J'espère ne pas être trop vague , je vous remercie d'avance !

  2. #2
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    D'abord, petite amélioration de ton code actuel : je suppose que le preg_split est là pour découper le fichier en ligne par ligne. Pour cela, tu peux simplement utiliser la fonction file à la place de file_get_contents, qui va t'extraire directement le fichier dans un tableau.

    Ensuite, je suppose que tu cherches à faire quelque chose comme "récupérer la valeur de la colonne 3 pour la ligne qui a comme valeur 42 dans la colonne 1". Est-ce que tu es censé retrouver une seule valeur, la ligne complète ou un ensemble de valeurs (ou de lignes complètes) ?
    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]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 6
    Par défaut
    Merci de la réponse rapide et du conseil !

    alors en fait pour mettre dans le contexte,

    j'ai une application ou je scanne des code barre ( j'utilise phonegap).
    et a chaque code barre scanné, l'app dois aller lire le referentiel CSV, chercher la ligne ou le code barre correspond a celui scanné, et pouvoir ensuite retirer par exemple le libéllé, ou encore le prix.

    c'est dans cette optique la

    j'imagine qu'il n'y a pas besoin du code qui fait le scanning, je stocke le code barre scanné dans une variable et je cherche avec celle-ci.

  4. #4
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $id = '043695';
     
    $file = file("../ref_103.csv");
     
    $libelle = call_user_func(function($lines, $id) {
        foreach ($lines as $line) {
            $data = str_getcsv($line, '|'); // parse la ligne en CVS
            if ($data[1] == $id) { // si la colonne 1 contient la valeur recherchée
                return $data[3]; // on retourne la valeur de la colonne 3
            }
        }
        return;
    }, $file, $id);
    C'est sans doute améliorable, mais ça donne un ordre d'idées : on parcours les lignes, on parse en CSV et on recherche une valeur donnée à un emplacement donné pour retourner une autre colonne dans la ligne trouvée.
    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]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 6
    Par défaut
    C'est ce qu'il me fallait !

    je vais exploiter tout ça , un tout grand merci pour ton temps et ton aide

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Tu ne peux pas extraire une ligne précise en fonction d'une variable.
    Tu es obligé de parser tout le fichier jusqu'à trouver la valeur que tu cherches. Si ce que tu cherche est à la première ligne ca ira vite si c'est au bout du fichier ca sera plus long.

    Donc par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function readcsv($scan)
    {
        $csvFile = file('fichier.csv');
        $data = [];
        foreach ($csvFile as $line) {
            $data[] = str_getcsv($line);
            if($data[1] == $scan)
                return $data[3];
        }
        return false;
    }
    En partant du principe que le 2 ème élément est le code bar (choix purement aléatoire) , cette exemple renvois le label (4ème élément) si la valeur de $scan est retrouvé.

    -- Edit --
    Devancé par Celira ...
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut


    Et effectivement, grunk a raison sur la rapidité : si ton fichier est très long et que tu cherches la dernière ligne, ça va être moins rapide que la 1ere ligne d'un fichier court. Après, selon la volumétrie et le nombre d'accès à faire, ça peut être judicieux d'envisager une base de données.
    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]

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 6
    Par défaut
    J'imagine bien qu'une base de donnée est plus efficace oui,

    Je suis en stage en fait et on me demande de faire ca, en fait j'utilise une base de donnée mais on me demande de faire également une version "offline" de l'application avec justement ce fichier CSV, comme ca vous connaissez toute l'histoire

  9. #9
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 013
    Par défaut
    Même si tu dois faire ça en local, tu peux très bien (si on t'y autorise) faire tourner une base de données en locale, un truc comme MongoDB ou SQLite (pas besoin d'une machine de guerre pour ce que tu veux faire).

    Aussi plutôt que de charger le fichier avec file puis de parser chaque item avec str_getcsv autant utiliser fgetcsv qui charge une ligne et la parse en même temps.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Traiter un fichier csv avec un champ entouré de guillemets
    Par Thierry_59300 dans le forum Excel
    Réponses: 4
    Dernier message: 29/06/2016, 15h00
  2. [XL-2010] importer et traiter un fichier csv dans une feuille excel
    Par guilhemaore dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/11/2015, 12h06
  3. Traiter un fichier CSV
    Par vOnYuRi dans le forum BIRT
    Réponses: 0
    Dernier message: 25/08/2011, 10h57
  4. Débutant, Comment traiter un fichier txt (csv)?
    Par djodjo2050 dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/10/2007, 18h41
  5. Réponses: 2
    Dernier message: 13/03/2007, 12h19

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