Position actuelle: Accueil> Derniers articles> Fichier des compétences de gestion du pointeur dans FGETCSV, comment éviter la lecture répétée des données?

Fichier des compétences de gestion du pointeur dans FGETCSV, comment éviter la lecture répétée des données?

gitbox 2025-09-09

Lorsque vous utilisez PHP pour traiter les fichiers CSV, FGETCSV () est une fonction très courante et efficace qui peut lire les fichiers CSV ligne par ligne et analyser chaque ligne de données dans un tableau. Cependant, FGETCSV () peut provoquer des lectures répétées de données et même sauter certaines lignes si elles sont gérées accidentellement par des pointeurs de fichiers lors de la gestion des fichiers importants. Pour éviter ces problèmes, nous devons maîtriser les compétences de gestion des pointeurs de fichiers. Cet article plongera dans la façon d'éviter efficacement des lectures répétées de données et s'assurera que chaque lecture de ligne est correcte.

1. Comprendre le principe de travail des pointeurs de fichiers et fGetcsv ()

Dans PHP, les pointeurs de fichiers sont utilisés pour marquer l'emplacement du fichier en cours de lecture ou d'écriture. Lorsque nous ouvrons un fichier et utilisons la fonction FGETCSV () pour lire les données, le pointeur de fichier déplace une ligne vers le bas à chaque opération de lecture. Lorsque le fichier est lu, le pointeur reste à la fin du fichier.

Chaque fois que FGETCSV () est appelé, il commence à lire une ligne de données CSV à partir de la position actuelle et déplace le pointeur vers le bas d'une ligne. Si nous manipulons accidentellement des pointeurs de fichiers, les situations suivantes peuvent être causées:

  • Répétez la lecture : le programme peut relire les données traitées car le pointeur de fichier n'est pas déplacé correctement.

  • Sautez les données : le pointeur de fichier saute trop, ce qui fait manquer certaines lignes.

2. Utilisez ftell () et fseek () pour contrôler les pointeurs de fichiers

Pour vous assurer que le pointeur de fichier est positionné correctement chaque fois que vous lisez, vous pouvez utiliser les fonctions ftell () et fseek () pour effectuer un contrôle plus détaillé.

  • ftell () : Obtenez l'emplacement du pointeur de fichier actuel.

  • fseek () : déplace le pointeur de fichier vers la position spécifiée en fonction du décalage donné.

Ces deux fonctions peuvent nous aider à déplacer les pointeurs de fichiers dans des situations spécifiques et à éviter de lire des données en double ou manquantes.

Exemple de code:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-variable">$lineNumber</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) !== </span><span><span class="hljs-literal">FALSE</span></span><span>) {
        </span><span><span class="hljs-variable">$lineNumber</span></span><span>++;
        
        </span><span><span class="hljs-comment">// Obtenez la position actuelle du pointeur</span></span><span>
        </span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftell</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
        
        </span><span><span class="hljs-comment">// Imprimez le contenu de la ligne actuelle</span></span><span>
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Line <span class="hljs-subst">$lineNumber</span></span></span><span>: " . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">", "</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
        
        </span><span><span class="hljs-comment">// Dans certains cas(Par exemple, sautez certaines lignes)DisponiblefseekPosition à l&#39;emplacement spécifié</span></span><span>
        </span><span><span class="hljs-comment">// fseek($file, $position + 100);  // Exemple:franchir100Octets</span></span><span>
    }

    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. Conseils pour éviter la lecture répétée lors de l'utilisation de fGetcsv ()

Lors de la lecture des fichiers CSV dans une boucle, nous rencontrons généralement les situations suivantes. Nous pouvons prendre des mesures correspondantes pour éviter la lecture répétée:

3.1 Lisez certaines données du fichier à l'avance

Si vous devez effectuer un prétraitement sur le fichier avant de lire les données, telles que l'obtention de l'en-tête de fichier ou la vérification de certaines conditions, vous pouvez faire avancer le pointeur de fichier après avoir lu la première ligne de données.

3.2 Enregistrer l'emplacement lors du traitement des données pendant la lecture

Lors du traitement des fichiers CSV, nous pouvons vérifier si certaines données ont été lues en fonction de l'emplacement du pointeur de fichier. Par exemple, vous pouvez déterminer si la fin du fichier a atteint la fin du fichier en fonction de la valeur de retour de la fonction ftell () , ou si certaines données non valides doivent être ignorées.

3.3 Évitez de lire plusieurs fois le même contenu via le mécanisme de cache

Si un contenu dans un fichier CSV peut être lu plusieurs fois (comme les données d'en-tête ou certaines lignes spécifiques), nous pouvons utiliser Cache pour stocker temporairement les données pour éviter les lectures répétées inutiles.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-variable">$cache</span></span><span> = [];
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) !== </span><span><span class="hljs-literal">FALSE</span></span><span>) {
        </span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>];  </span><span><span class="hljs-comment">// Supposons que nous jugeons s&#39;il a été traité en fonction de la valeur de la première colonne.</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$cache</span></span><span>)) {
            </span><span><span class="hljs-comment">// Traitement des données</span></span><span>
            </span><span><span class="hljs-variable">$cache</span></span><span>[] = </span><span><span class="hljs-variable">$key</span></span><span>;
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">", "</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
        }
    }

    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

4. Traitement correct après la fin du fichier

Lorsque le fichier est lu, nous devons accorder une attention particulière à l'emplacement du pointeur de fichier. Dans certains cas, FGETCSV () peut quitter tôt en raison de lignes vides ou de caractères spécifiques à la fin du fichier et ne reviendra plus faux . À ce stade, nous pouvons utiliser la fonction feof () pour vérifier si la fin du fichier a atteint, ou s'appuyer sur fGetcsv () pour retourner false pour marquer la fin.

5. Résumé

FGETCSV () est une fonction puissante, mais la gestion correcte des pointeurs de fichiers est la clé pour assurer une lecture précise des données. En utilisant des fonctions telles que ftell () et fseek () , nous pouvons contrôler avec précision la position du pointeur de fichier, en évitant les lectures répétées ou en sauter des données. De plus, l'utilisation rationnelle du cache et du jugement logique peut encore améliorer l'efficacité de la lecture et réduire la consommation inutile des ressources. J'espère que grâce aux compétences de cet article, vous pouvez mieux maîtriser l'utilisation de FGETCSV () et gérer des fichiers CSV plus complexes.