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 :

utiliser la fonction SplFixedArray


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 136
    Points : 4 448
    Points
    4 448
    Billets dans le blog
    1
    Par défaut utiliser la fonction SplFixedArray
    Bonjour,

    devant traiter des fichiers assez gros (fichier CSV de 110 000 lignes), pour stocker les données dans une variable avant de les traiter, j'envisage d'utiliser un tableau avec la classe SplFixedArray sachant, si j'ai bien compris, qu'ainsi on allait économiser de la mémoire par rapport à l'utilisation d'un tableau standard. Simplement pour créer une instance de cette classe, on doit fournir la taille du tableau (exemple de la doc : $array = new SplFixedArray(5);). Je pense donc qu'il va falloir demander à l'utilisateur qui va fournir le fichier CSV, le nombre de lignes, qui va déterminer la taille du tableau. Est-ce exact ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

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

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

    Informations forums :
    Inscription : août 2003
    Messages : 6 466
    Points : 18 965
    Points
    18 965
    Par défaut
    Il suffit de parcourir le fichier pour compter les lignes et ainsi donner la bonne valeur à ton constructeur.

    Mais clairement ce n'est pas une bonne idée de stocker tout un fichier dans un tableau.
    Autant traiter au fur et à mesure des lignes.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 136
    Points : 4 448
    Points
    4 448
    Billets dans le blog
    1
    Par défaut
    OK pour parcourir le tableau plutôt que demander à l'utilisateur de saisir le nombre de lignes.

    Par contre, la taille des fichiers CSV (max = 33ko) ne devrait pas poser de problème pour en stocker le contenu dans une variable. Comme en outre, je compte stocker dans ce tableau l'ID de l'insert pour ne pas avoir de SELECT à faire pour obtenir celui-ci (qui serait très chronophage quand la table deviendra grosse), obligé de constituer un tableau contenant toutes les données.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 136
    Points : 4 448
    Points
    4 448
    Billets dans le blog
    1
    Par défaut
    J'ai réouvert cette discussion, ayant des difficultés pour initialiser le tableau.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     $nb_lines = CSVParser::getNblines();
     
            $array = new SplFixedArray($nb_lines);
     
            //construire un tableau avec ttes les lignes du CSV
            rewind(CSVParser::getHandle()); // pointer début fichier
            $ind = 0;
            while (($line_csv = fgetcsv(CSVParser::getHandle(), 0, CSVParser::getSeparator(),
                    CSVParser::getEnclosure(),"")) !== false)
            {
                $array[$ind++] = $line_csv;
            }
    Avec ce code, le tableau est correctement affecté, par contre, une fois le fichier parcouru, au lieu de sortir proprement du while,
    Fatal error: Uncaught RuntimeException: Index invalid or out of range in C:\projets\ticket_rawsrc\src\controller\CSVImportController.php:107 Stack trace: #0 C:\projets\ticket_rawsrc\index.php(131): ticket_rawsrc\controller\CSVImportController->invoke(Array) #1 {main} thrown in C:\projets\ticket_rawsrc\src\controller\CSVImportController.php on line 107
    C'est quoi le souci, SVP ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 136
    Points : 4 448
    Points
    4 448
    Billets dans le blog
    1
    Par défaut
    Aucune solution ne m'étant proposée, pour ne pas rester bloqué, je reviens à un tableau standard :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $array = [];
            rewind(CSVParser::getHandle()); // pointer début fichier
            while (($line_csv = fgetcsv(CSVParser::getHandle(), 0, CSVParser::getSeparator(),
                    CSVParser::getEnclosure(),"")) !== false)
            {
                $array[] = $line_csv;
            }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  6. #6
    Expert confirmé Avatar de Séb.
    Profil pro
    Inscrit en
    mars 2005
    Messages
    3 998
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 998
    Points : 5 668
    Points
    5 668
    Par défaut
    Tu fais bien de ne finalement pas utiliser SplFixedArray qui ajoutait une couche supplémentaire de complexité, à mon avis ça ne servait à rien pour ton problème initial.


    L'erreur :

    Fatal error: Uncaught RuntimeException: Index invalid or out of range
    Tu as du te retrouver avec un $ind supérieur ou égal à $nb_lines
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 136
    Points : 4 448
    Points
    4 448
    Billets dans le blog
    1
    Par défaut
    J'avais essayé SplFixedArray ayant rencontré des problèmes de mémoire, mais là, j'ai pu intialiser mon tableau avec le plus gros fichier CSV (dans mon cas, 33 ko, donc pas si gros que ça), et ça passe, donc je vais continuer comme ça.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

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

Discussions similaires

  1. [ASP] Utiliser la fonction PAD
    Par Hell dans le forum ASP
    Réponses: 4
    Dernier message: 31/03/2005, 17h23
  2. manuel d'utilisation de fonction
    Par SteelBox dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 11/10/2004, 02h28
  3. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 16h43
  4. Réponses: 11
    Dernier message: 22/12/2003, 22h06
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 16h04

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