[Comment les fonctions FGETCSV et FSEEK fonctionnent-elles ensemble pour lire des données à des emplacements spécifiques dans les fichiers CSV? ]]
Dans PHP, lors du traitement des fichiers CSV, nous utilisons généralement la fonction FGETCSV () pour lire chaque ligne de données dans le fichier. Mais parfois, nous voulons pouvoir ignorer les premières lignes du fichier ou commencer à lire les données à partir d'un certain emplacement, et la fonction fseek () peut fonctionner. En utilisant ces deux fonctions ensemble, nous pouvons contrôler avec précision la position de départ des données de lecture, traitant ainsi des fichiers gros ou des données spécifiques plus efficacement.
FGETCSV () est l'une des fonctions intégrées en PHP et est généralement utilisée pour lire des fichiers au format CSV. Il lit une ligne de données de la position actuelle du pointeur de fichier et l'analyse dans un tableau. Chaque élément de tableau correspond à une colonne du fichier CSV. L'utilisation de base de FGETCSV () est la suivante:
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"file.csv"</span></span><span>, </span><span><span class="hljs-string">"r"</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">$handle</span></span><span>, </span><span><span class="hljs-number">1000</span></span><span>, </span><span><span class="hljs-string">","</span></span><span>)) !== </span><span><span class="hljs-literal">FALSE</span></span><span>) {
</span><span><span class="hljs-comment">// Traiter chaque rangée de données</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
</span></span>fGetcsv () peut accepter trois paramètres:
Gandage : la ressource de fichier ouvert.
Longueur : le nombre maximum d'octets à lire.
Delimiter : Delimiter, par défaut vers la virgule.
La fonction fseek () est utilisée pour ajuster la position du pointeur de fichier, nous permettant de passer à une position d'octet spécifique dans le fichier. L'utilisation de base de fseek () est la suivante:
<span><span><span class="hljs-title function_ invoke__">fseek</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-variable">$offset</span></span><span>, SEEK_SET);
</span></span>$ Handle : Handle de fichier.
$ Offset : Offset, indiquant le nombre d'octets à déplacer.
Seek_set : indique que le décalage est calculé à partir du début du fichier. Les autres constantes couramment utilisées incluent Seek_cur (par rapport à la position actuelle) et Seek_end (par rapport à la fin du fichier).
En utilisant fseek () et fGetcsv () en combinaison, nous pouvons commencer à lire les données à partir d'un emplacement spécifique dans le fichier CSV. Supposons que nous voulons ignorer les 10 premières lignes dans le fichier CSV, puis commencer à lire les données de la ligne 11. Voici l'implémentation spécifique:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">'file.csv'</span></span><span>;
</span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filename</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">$handle</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// utiliserfseekSauter avant10D'ACCORD</span></span><span>
</span><span><span class="hljs-variable">$linesToSkip</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>;
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$linesToSkip</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>); </span><span><span class="hljs-comment">// 逐D'ACCORD读取并跳过</span></span><span>
}
</span><span><span class="hljs-comment">// Depuis11D'ACCORD开始读取数据</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">$handle</span></span><span>, </span><span><span class="hljs-number">1000</span></span><span>, </span><span><span class="hljs-string">","</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// Traiter chaque rangée de données</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Impossible d'ouvrir le fichier!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Dans cet exemple, nous utilisons d'abord fseek () (ou fgets () ) pour sauter les 10 premières lignes de données, puis utilisons fGetcsv () pour lire et traiter les données de la position actuelle du pointeur de fichier.
Gestion des fichiers volumineux : pour les grands fichiers CSV, à l'aide de fseek () peut nous aider à ignorer les pièces inutiles et à lire uniquement les données requises. Par exemple, sautez la ligne de titre, la ligne vierge ou une ligne de données qui a été traitée dans le fichier.
Accès aléatoire aux données CSV : Parfois, nous devons commencer à lire les données à partir d'un emplacement spécifique dans le fichier CSV, ou lire certaines colonnes d'une ligne spécifiée. Cette exigence peut être facilement réalisée en définissant raisonnablement le décalage fseek () .
Améliorer les performances : lorsque nous n'avons pas besoin de lire l'intégralité du fichier à partir de zéro, Fseek () peut être utilisé pour localiser directement un emplacement spécifique du fichier, réduisant la lecture de données inutiles, améliorant ainsi les performances du programme.
Problème du pointeur de fichier : lorsque Fseek () est appelé, la position actuelle du pointeur de fichier changera et les opérations de lecture suivantes commencent à partir d'un nouveau poste. Assurez-vous donc que lors de l'utilisation de fseek () , le pointeur de fichier a été positionné vers le bon emplacement que vous souhaitez commencer à lire.
Compense de FSEEK : Le décalage de fseek () est en octets, donc lors du traitement des fichiers CSV, si la longueur des lignes de fichiers est incohérente, elle peut provoquer une erreur. Pour éviter cela, nous utilisons généralement FGETS () pour sauter les lignes, ou nous assurons que chaque ligne du fichier est relativement uniforme en longueur.
Mode d'ouverture du fichier : assurez-vous d'ouvrir le fichier en mode de lecture ( R ), sinon le pointeur de fichier ne peut pas être ajusté à l'aide de fseek () .
En combinant FGETCSV () et Fseek () , nous pouvons lire plus de données spécifiques dans les fichiers CSV. Fseek () offre la possibilité de contrôler avec précision la position du pointeur de fichier, tandis que FGETCSV () nous aide à analyser chaque ligne d'un fichier CSV dans un tableau. La combinaison des deux peut améliorer efficacement notre efficacité lors du traitement des fichiers volumineux ou de l'accès aléatoire.