Bei der Verwendung von PHP zum Verarbeiten von CSV -Dateien ist FGetCSV () eine sehr häufige und effiziente Funktion, mit der CSV -Dateien Zeile nach Zeile gelesen und jede Datenzeile in ein Array analysieren können. FGetCSV () kann jedoch wiederholte Datenwerte verursachen und sogar bestimmte Zeilen überspringen, wenn sie bei der Behandlung großer Dateien versehentlich von Dateizeigern verwaltet werden. Um diese Probleme zu vermeiden, müssen wir die Fähigkeiten des Dateizeigermanagements meistern. In diesem Artikel werden wiederholte Datenablesungen effektiv vermieden und sicherstellen, dass jede Lesen jeder Zeile korrekt ist.
In PHP werden Dateizeiger verwendet, um den Speicherort der derzeit gelesenen oder geschriebenen Datei zu markieren. Wenn wir eine Datei öffnen und die Funktion fGetCSV () zum Lesen der Daten verwenden, verschiebt der Dateizeiger eine Zeile mit jedem Lesevorgang nach unten. Wenn die Datei gelesen wird, bleibt der Zeiger am Ende der Datei.
Jedes Mal, wenn fGetCSV () aufgerufen wird, wird eine Reihe von CSV -Daten aus der aktuellen Position gelesen und den Zeiger eine Zeile nach unten verschoben. Wenn wir versehentlich Dateizeiger manipulieren, können die folgenden Situationen verursacht werden:
Wiederholen Sie Lesen : Das Programm kann die verarbeiteten Daten erneut lesen, da der Dateizeiger nicht korrekt verschoben wird.
Daten überspringen : Dateizeiger springt zu stark, wodurch einige Zeilen übersehen werden.
Um sicherzustellen, dass der Dateizeiger bei jedem Lesen korrekt positioniert ist, können Sie die Funktionen ftell () und fseek () verwenden, um eine detailliertere Steuerung auszuführen.
ftell () : Holen Sie sich den Speicherort des aktuellen Dateizeigers.
fseek () : Verschiebt den Dateizeiger an der angegebenen Position basierend auf dem gegebenen Versatz.
Diese beiden Funktionen können uns helfen, Dateizeiger in bestimmten Situationen zu verlagern und zu vermeiden, dass doppelte oder fehlende Daten gelesen werden.
<span><span><span class="hljs-meta"><?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">// Holen Sie sich die aktuelle Zeigerposition</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">// Drucken Sie den Inhalt der aktuellen Linie aus</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">// In einigen Fällen(Zum Beispiel bestimmte Zeilen überspringen)VerfügbarfseekPosition zum angegebenen Ort</span></span><span>
</span><span><span class="hljs-comment">// fseek($file, $position + 100); // Beispiel:über etwas springen100Bytes</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">?></span></span><span>
</span></span>
Beim Lesen von CSV -Dateien in einer Schleife treffen wir normalerweise auf die folgenden Situationen. Wir können entsprechende Maßnahmen ergreifen, um wiederholtes Lesen zu vermeiden:
Wenn Sie vor dem Lesen der Daten einige Vorverarbeitung in der Datei durchführen müssen, z. B. das Abrufen des Dateiheaders oder die Überprüfung bestimmter Bedingungen, können Sie den Dateizeiger nach dem Lesen der ersten Datenzeile verschieben.
Bei der Verarbeitung von CSV -Dateien können wir überprüfen, ob einige Daten basierend auf dem Speicherort des Dateizeigers gelesen wurden. Sie können beispielsweise feststellen, ob das Ende der Datei das Ende der Datei basierend auf dem Rückgabewert der Funktion ftell () erreicht hat oder ob einige ungültige Daten übersprungen werden müssen.
Wenn einige Inhalte in einer CSV -Datei mehrmals gelesen werden können (z. B. Header -Daten oder bestimmte Zeilen), können wir Cache verwenden, um die Daten vorübergehend zu speichern, um unnötige wiederholte Messwerte zu vermeiden.
<span><span><span class="hljs-meta"><?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">// Angenommen, wir beurteilen, ob es auf der Grundlage des Werts der ersten Spalte verarbeitet wurde.</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">// Verarbeitungsdaten</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">?></span></span><span>
</span></span>
Wenn die Datei gelesen wird, müssen wir dem Speicherort des Dateizeigers besondere Aufmerksamkeit schenken. In einigen Fällen kann FGetCSV () aufgrund leerer Zeilen oder spezifischen Zeichen am Ende der Datei frühzeitig beenden und keine false zurückgeben. Zu diesem Zeitpunkt können wir die Funktion feof () verwenden, um zu überprüfen, ob das Ende der Datei erreicht ist, oder sich auf fGetCSV () verlassen, um False zurückzugeben, um das Ende zu markieren.
fGetCSV () ist eine leistungsstarke Funktion, aber die korrekte Verwaltung von Dateizeigern ist der Schlüssel zur Sicherstellung eines genauen Lesens von Daten. Durch die Verwendung von Funktionen wie ftell () und fseek () können wir die Position des Dateizeigers genau steuern, wiederholte Messungen oder Überspringen von Daten vermeiden. Darüber hinaus kann die rationale Verwendung von Cache und logischem Urteilsvermögen die Effizienz des Lesens weiter verbessern und den unnötigen Ressourcenverbrauch verringern. Ich hoffe, dass Sie durch die Fähigkeiten dieses Artikels die Verwendung von FGetCSV () besser beherrschen und komplexere CSV -Dateien verarbeiten können.