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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 107
    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 confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    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.

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 107
    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 confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 107
    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 confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    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() ;-)

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

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 107
    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 confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 107
    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

+ 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