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 :

Tri (sort) d'un tableau CSV a 4 dimensions avec génération du résultat dans un autre fichier CSV


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut Tri (sort) d'un tableau CSV a 4 dimensions avec génération du résultat dans un autre fichier CSV
    Bonjour,

    Je suis vraiment débutant en PHP, je cherche a trier par ordre croissant un tableau issu d'un fichier CSV ayant 4 dimensions.
    Le tri devra s'opérer en prenant pour référence la 1ere dimension ( celle ci contient une date au format epoch )


    Mon fichier CSV appelé "data.csv" est donc conçu de la façon suivante :
    temps au format epoch, type de sortie commandée, action, type de récurrence \r\r

    chaque ligne du tableau contient 4 données séparées d'une virgule, on passe à la ligne suivante avec \r\n

    Dans la réalité , cela se présente ainsi :

    1485644400000,sortie1,permanent,5\r\n
    1485646800000,sortie8,on,4\r\n
    1485643500000,sortie1,permanent,5\r\n
    1485647400000,sortie1,permanent,5\r\n
    1485645000000,sortie10,permanent,1\r\n
    1485643800000,sortie2,off,6\r\n
    1485644100000,sortie9,permanent,1\r\n
    1485646700000,sortie1,permanent,5\r\n
    1485644700000,sortie3,flash,8\r\n
    1485646200000,sortie7,flash,7\r\n
    1485645600000,sortie7,off,6\r\n

    J'ai besoin de classer chronologiquement ce tableau brut en tableau ordonné selon la 1ere dimension afin d'obtenir au final ceci :

    1485643500000,sortie1,permanent,5\r\n
    1485643800000,sortie2,off,6\r\n
    1485644100000,sortie9,permanent,1\r\n
    1485644400000,sortie1,permanent,5\r\n
    1485644700000,sortie3,flash,8\r\n
    1485645000000,sortie10,permanent,1\r\n
    1485645600000,sortie7,off,6\r\n
    1485646200000,sortie7,flash,7\r\n
    1485646700000,sortie1,permanent,5\r\n
    1485646800000,sortie8,on,4\r\n
    1485647400000,sortie1,permanent,5\r\n

    Une fois classé le tableau classé et ordonné, il faudrait pouvoir enregistrer celui-ci au format CSV s'appeler "tableau_classe.csv"

    A partir de ce nouveau tableau classé, j'aurai besoin de générer un 3eme fichier csv appelé "short.csv" qui ne contiendrait qu'une seule ligne qui serait en fait une simple recopie de 1ere ligne du tableau classée, soit ceci :
    1485643500000,sortie1,permanent,5\r\n


    C'est peut être un peu trop ambitieux pour un débutant en PHP comme moi, car en fait je ne sais pas du tout comment faire.
    J'ai lu que XSLT pouvait faire cela à partir de fichier XML, mais cela semble encore plus compliqué ...

    Je vous remercie beaucoup de l'aide que vous voudrez bien m'apporter.
    Cordialement,

    Laurent

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça.

    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
     
    <?php 
    $lines = file('test.csv');
    natsort($lines);
     
    //---- Fichier trié
    $fp = fopen("tableau_classe.csv", 'w');
    fwrite($fp, implode ( "" , $lines));
    fclose($fp);
     
    //---- Fichier mono ligne
    $fp = fopen("short.csv", 'w');
    fwrite($fp,$lines[0]);
    fclose($fp);
    ?>

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup,

    Il fonctionne bien, seulement il semble y avoir un soucis car le tableau classé contient ceci :
    Il y a problème avec la ligne 7 / 8 qui restent sur la même ligne , le 1er chiffre de la ligne 8 a disparu, cependant je ne vois pas d'anomalie dans le fichier "test.txt" de départ.

    1485643500000,sortie1,permanent,5
    1485643800000,sortie2,off,6
    1485644100000,sortie9,permanent,1
    1485644400000,sortie1,permanent,5
    1485644700000,sortie3,flash,8
    1485645000000,sortie10,permanent,1
    1485645600000,sortie7,off,61485646200000,sortie7,flash,7
    1485646700000,sortie1,permanent,5
    1485646800000,sortie8,on,4
    1485647400000,sortie1,permanent,5

    Puis je vous demander de commenter chaque ligne afin que je puisse bien comprendre les étapes svp ?

    Merci beaucoup,
    Fichiers attachés Fichiers attachés

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pareil. Je ne comprends pas pourquoi les lignes ont été collées.

    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
     
    <?php 
    //---- Lit le fichier .csv et place chaque ligne dans un tableau
    $lines = file('test.csv');
    //---- Trie le tableau dans l'ordre naturel
    natsort($lines);
     
    //---- Fichier trié
    $fp = fopen("tableau_classe.csv", 'w');
    //---- remplacement des sauts de lignes par rien dans le tableau 
    //     + ajout d'un saut de ligne entre chaque poste du tableau (implode)
    fwrite($fp, implode ( "\r\n" , str_replace("\r\n","",$lines)));
    fclose($fp);
     
    //---- Fichier mono ligne
    $fp = fopen("short.csv", 'w');
    fwrite($fp,$lines[0]);
    fclose($fp);
    ?>

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci pour les commentaires dans le code, par contre je ne comprends pas ce bug, j'ai fait afficher tous les caractères de mon fichier test
    tout semble correct.

    Existe t-il d'autres moyens d'effectuer un tri ?

    Juste pour comprendre, si j'aurai voulu classé selon le 2eme element de chaque ligne, qu'aurait il fallu modifier ?
    Images attachées Images attachées  

  6. #6
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Le tri avec natsort fonctionne uniquement parce que le tri est à faire dans l'ordre des données. C'est un effet d'aubaine si je puis dire.
    Si le tri doit se faire autrement, tout est à revoir. Bien entendu il faut dans ce cas faire un programme qui traite tous les cas.

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie cette technique. Il y en a peut être d'autre.
    Pas testé.

    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
     
    <?php
    $line = array();
    $row  = 0;
    if (($handle = fopen("test.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $line[$row]   = $data;
            $row++;
        }
        fclose($handle);
    }
     
    //----- Tri sur la colonne 2 (la 3ème du fichier en fait) puis tri sur la colonne 3 (la 4ème du fichier en fait)
    $critere1 = array();
    $critere2 = array();
    foreach($line as $key => $value) {
    	$critere1[$key] = $value[2];
    	$critere2[$key] = $value[3];
    }
    array_multisort($critere1,SORT_ASC,SORT_NATURAL,$critere2,SORT_ASC,SORT_NATURAL,$line);
     
    //---- Fichier trié
    $fp = fopen("tableau_classe.csv", 'w');
    foreach($line as $key => $value) {
    	fwrite($fp, implode ( "," , $value)."\r\n");
    }
    fclose($fp);

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2008, 16h05
  2. Réponses: 5
    Dernier message: 04/03/2008, 22h22
  3. Réponses: 5
    Dernier message: 13/02/2008, 10h22
  4. Réponses: 1
    Dernier message: 10/01/2008, 13h52
  5. Réponses: 2
    Dernier message: 11/06/2007, 16h40

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