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 :

lire plusieurs lignes d'un fichier csv


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 125
    Points : 55
    Points
    55
    Par défaut lire plusieurs lignes d'un fichier csv
    Bonjour,

    Afin de lire un fichier csv, contenant potentiellement de très nombreuses lignes, je souhaite lire N lignes à la fois et récupérer les données pour les traiter. puis lire les N lignes suivante, etc.

    Le fichier csv est "standard" : X lignes de contenu séparé par des virgules

    Avec la fonction file(), j'obtiens le résultat attendu mais le traitement des lignes csv est à prendre en compte (explode serait à ajouter)
    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
     
    function useFile($csvfile, $offset, $lines2read)
    {
    	if (file_exists($csvfile))
    	{
    		$tab = array();
    		$lines = file($csvfile);
    		$max = count($lines);
    		for($i=$offset;$i<$offset+$lines2read;$i++)
    		{
    			if ($i<$max && trim($lines[$i]) != '')
    			{
    $tab[$i] = $lines[$i];
    			}
    		}
    		return $tab;
    	}
    	else
    		return false;
    }
    c'est pourquoi je pensais à la fonction seek de SplFileObject :
    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
     
    function readFileSeek($csvfile, $offset=0, $lines2read=3)
    {
    	if (file_exists($csvfile))
    	{
    		$tab = array();
    		$file = new SplFileObject($csvfile, 'rb');
    		for($i=0;$i<$lines2read;$i++)
    		{
    			if (! $file->eof())
    			{
    				$line= $offset+$i;
    				$file->seek($line);
    				$csvline = $file->fgetcsv();
    $tab[$line] = $csvline;
    			}
    		}
    		return $tab;
    	}
    	else
    		return false;
    }
    cette fonction me renvoie un tableau de tableaux d'élément de chaque ligne. C'est ce que j'attends.


    Sauf que pour une raison que je n'arrive pas à expliquer, si par exemple je veux lire 5 lignes, à partir du début
    var_dump(readFileSeek($csvfile, 0, 5));

    j'obtiens le contenu de la ligne 0, 2, 3, 4, 5 ! la fonction "saute" la 2eme ligne
    Et c'est là même chose si je change la ligne de départ, ce sui signifie qu'il n'y a pas de problème de reconnaissance de fin de ligne.
    Ce problème me laisse perplexe !
    y'a t'il quelqu'un qui a une explication (et une solution) ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    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 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Compliqué tout ça.

    Utilise plutôt fopen/getcsv/fclose.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il y a un bug sur ce sujet ouvert en ... 2008

    https://bugs.php.net/bug.php?id=46569
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 125
    Points : 55
    Points
    55
    Par défaut
    merci pour avoir pointé le bug, j'étais passé à coté.
    Compliqué tout ça.
    bah là c'est rien encore
    Je m'y prends peut-être mal, mais le but est de :
    1) récupérer les n premières lignes du csv
    2) effectuer un traitement sur le contenu
    3) récupérer la position de la ligne
    4) reprendre l'étape 1 à partir de n+postiion

    je pense lancer la boucle dans ma page principale et faire un appel jquery / ajax pour permettre le traitement d'une part (etapes 1 à 4) et renvoyer la position de la ligne pour la réinjecter dans le tour de boucle suivant.

    le traitement des données récupérées pouvant être long (gestion d'images, insertion de données dans la BDD...), je dois effectuer cette lecture par morceau du fichier. D'où mon code.

    je n'ai pas trouvé de code ou de fonction php permettant de lire uniquement n lignes d'un fichier csv.
    C'est pourquoi j'imagine cette solution "compliquée".
    Si vous avez plus simple ou une fonction toute faite, je suis preneur.

    Utilise plutôt fopen/getcsv/fclose.
    , ça ne me paraît à première vue pas idéal pour parser du csv. J'ai lu qu'il y a potentiellement des problème si l'encodage du fichier s'embrouille pour les retour à la ligne. (je n'ai pas noté la référence du post).

Discussions similaires

  1. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  2. Lire certaines lignes d'un fichier csv
    Par damdam44 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/05/2008, 11h29
  3. [CSV] Ne lire que la premiere ligne d'un fichier CSV
    Par passie dans le forum Langage
    Réponses: 7
    Dernier message: 05/07/2006, 12h02
  4. Réponses: 12
    Dernier message: 18/06/2006, 19h42
  5. [BATCH] lire chaque ligne d'un fichier texte
    Par bartmarley dans le forum Windows
    Réponses: 13
    Dernier message: 22/04/2005, 21h01

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