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 :

Fusion de plusieurs csv en 1 [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut Fusion de plusieurs csv en 1
    bonjour
    je souhaite fusionner plusieurs fichiers csv pour n'en faire qu'un seule par l'intermédiaire d'une clé primaire.
    j'y arrive bien en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if (($fp=fopen($file1,"r"))!==FALSE{
        while ($line=fgetcsv($fp,1000,";",'"')){
              $lines[$line[0]]=$line;
        }
    fclose($fp);
    }
     
    if (($fp2=fopen($file2,"r"))!==FALSE{
        while ($line=fgetcsv($fp2,1000,";",'"')){
              $lines[$line[0]][]=$line[1];
        }
    fclose($fp2);
    }
    et ainsi de suite, puis un fputcsv pour concaténer le tout

    sauf qu'une chose m'embête, quand le résultat n'est pas trouvé, ça ne décale pas en ajoutant un séparateur, du coup j'ai des données incohérentes dans une même colonne ...
    ça n'ajoute les données que quand la clé primaire est trouvée, j'aimerai ajouter un "vide"+séparateur quand la clé primaire n'est pas trouvée à partir du premier fichier (file1)

    auriez-vous une idée ? mon niveau en php est très bas
    merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines[$line[0]][]=$line[1];
    Ici tu supprimes ce que tu as trouvé dans $file1 en le remplaçant par un empilement de tes valeurs $line[1].

    Donne un extrait de tes 2 fichiers source et du fichier que tu souhaiterais en obtenir.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    imaginons, fichier 1 :
    11111;nom1
    22222;nom2
    33333;nom3
    44444;nom4
    55555;nom5
    fichier 2 :
    11111;100
    22222;120
    55555;150.15
    le résultat que j'aimerai :
    11111;nom1;100
    22222;nom2;120
    33333;nom3;0
    44444;nom4;0
    55555;nom5;150.15
    merci

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines[$line[0]][]=$line[1];
    Ici tu supprimes ce que tu as trouvé dans $file1 en le remplaçant par un empilement de tes valeurs $line[1].

    effectivement, dis comme ça fait un peu moche par rapport au résultat souhaité

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    OK je vois, je ferais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Indexage de $file1
    $fp = fopen($file1, 'r');
    $result = [];
    while (($line = fgetcsv($fp, 0, ';', '"', '') !== false) {
        // Indexage + affectation de la valeur par défaut "0"
        $result[$line[0]] = [$line[0], $line[1], '0'];
    }
     
    // Recherche des valeurs
    $fp = fopen($file2, 'r');
    while (($line = fgetcsv($fp, 0, ';', '"', '') !== false) {
        // Affectation de la valeur selon la clef $line[0]
        $result[$line[0]][2] = $line[1];
    }
    En sortie de la 2nde boucle le tableau associatif $result contiendra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [
        '11111' => ['11111', 'nom1', '100'],
        '22222' => ['22222', 'nom2', '120'],
        '33333' => ['33333', 'nom3', '0'],
        '44444' => ['44444', 'nom4', '0'],
        '55555' => ['55555', 'nom5', '150.15'],
    ]
    Qu'il te suffira de pourcourir pour appliquer fputcsv() ;-)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    bonjour
    merci de ta réponse
    ça semble magnifiquement fonctionner

    maintenant imaginons que je souhait le faire en cascade avec plusieurs fichiers à merge
    il me suffit de réindexer à chaque fois avant pour y mettre le 0 ?

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    ah ben non, je vais iniatiliser le 0 dans toutes mes colonnes en premier
    puis je remplie avec les valeurs
    ça devrait fonctionner comme ça

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Oui c'est ce qu'il y a de mieux à faire
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Salut
    ça avance bien, je me retrouve maintenant avec un tableau formaté
    et une extraction csv qui fonctionne

    j'ai néanmoins une petite question subsidiaire, dans le tableau j'aimerai modifier certaines valeurs sous conditions
    par exemple la colonne 2 de mon tableau (0=>11111;1=>nom1;2=>1)
    si un alors "non", si 2 alors "oui"

    j'utilise dans le foreach qui fait le fputcsv, la clause switch et me retrouve quelques messages "undefined offset", pourtant, le fichier semble maj ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach ($lines as $line){
         switch ($line[2]){
              case $line[2]=='1' : $line[2]='non';break;
              case $line[2]=='2' : $line[2]='oui';break;
         }     
    }
    je continue de chercher mais je dois mal m'y prendre
    merci de ton aide en tout cas

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    je pense avoir compris, mais ça m'arrange pas trop
    j'ai l'impression que des données ont été insérées dans le tableau final (tout fichier fusionnés)
    sans que la clé primaire ne soit trouvé dans le fichier de base (la source)

    et à mon avis ça peut venir aussi du séparateur " qui se trouve également dans certains "noms" que j'ai immédiatement remplacé avec str_replace

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Ton fichier CSV contient une valeur contenant un " et le champ n'est pas délimité par des " ?

    Fais un print_r de tes tableaux à chaque étape pour voir à quel moment apparaît l'anomalie

    Ton switch est bizarre (tu reviens à faire ('1111' == ($line[2] == '1111'))), tu risques d'avoir des résultats inattendus, fais un if
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    j'ai fait le nettoyage des caractère spéciaux avec un regex
    ok, j'essaierai le if

    par contre effectivement, les valeur des autres tableaux viennent s'ajouter en bout de fichier si la clé primaire n'est pas trouvé

    merci

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    salut
    j'ai remplacé les switch par des conditions if, elseif
    j'ai fait également le print_r

    les erreurs apparaissent dès le premier croisement de valeurs

  14. #14
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Donne un extrait de tes fichiers CSV, de ton script, et de ce que tu obtiens
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    plus d'erreur, je pense avoir réussi
    en fait je test d'abord avec in_array, si la valeur se trouve dans la source, si oui, je remplace les 0 par défaut par les valeurs, si non, je ne fais rien

    allez je crois que c'est la bonne

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

Discussions similaires

  1. Fusion de plusieurs lignes lues dans un fichier CSV
    Par M E H D I dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 28/12/2011, 11h49
  2. Fusion de plusieurs tables
    Par Rikou31 dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 23/02/2007, 11h08
  3. [XSLT] Fusion de plusieurs XML
    Par syvid dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 25/07/2006, 16h24
  4. fusion de plusieurs champs d'une table à une autre
    Par reolik dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/02/2006, 08h39
  5. Fusion de plusieurs requetes
    Par rossy dans le forum Access
    Réponses: 3
    Dernier message: 22/12/2005, 10h41

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