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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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 ?

  2. #2
    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
    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
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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.

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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 ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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;
            }

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    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 319
    Billets dans le blog
    17
    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

+ 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, 16h23
  2. manuel d'utilisation de fonction
    Par SteelBox dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 11/10/2004, 01h28
  3. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  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, 15h04

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