PHPを使用してCSVファイルを処理する場合、 FGETCSV()は、行ごとにCSVファイルを読み取り、各データの行を配列に解析できる非常に一般的で効率的な関数です。ただし、 FGETCSV()は、データの繰り返しの測定値を引き起こし、大きなファイルを処理する際にファイルポインターによって誤って管理されている場合、特定の行をスキップする場合さえあります。これらの問題を回避するには、ファイルポインター管理スキルをマスターする必要があります。この記事では、データの繰り返しの測定値を効果的に回避し、すべての行の読み取りが正しいことを確認する方法に飛び込みます。
PHPでは、ファイルポインターを使用して、現在読み取られているファイルの場所をマークします。ファイルを開き、 FGETCSV()関数を使用してデータを読み取ると、ファイルポインターは読み取り操作ごとに1行下に移動します。ファイルが読み取られると、ポインターはファイルの最後にとどまります。
FGETCSV()が呼び出されるたびに、現在の位置からCSVデータの行の読み取りを開始し、ポインターを1列に移動します。誤ってファイルポインターを操作する場合、次の状況が発生する可能性があります。
繰り返し読んでください:ファイルポインターが正しく移動されないため、プログラムは処理されたデータを読み直すことがあります。
データのスキップ:ファイルポインタージャンプが多すぎると、いくつかの行が見逃されます。
ファイルポインターが読み取るたびに正しく配置されるようにするために、 FTELL()とfSeek()関数を使用して、より詳細なコントロールを実行できます。
ftell() :現在のファイルポインターの場所を取得します。
fseek() :指定されたオフセットに基づいて、ファイルポインターを指定された位置に移動します。
これらの2つの機能は、特定の状況でファイルポインターを再配置し、複製または欠落データを読み取らないようにするのに役立ちます。
<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">// 現在のポインター位置を取得します</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">// 現在の行の内容を印刷します</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">// 場合によっては(たとえば、特定の行をスキップします)利用可能fseek指定された場所への位置</span></span><span>
</span><span><span class="hljs-comment">// fseek($file, $position + 100); // 例:飛び越える100バイト</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>
ループでCSVファイルを読むとき、通常、次の状況に遭遇します。繰り返し読むことを避けるために、対応する措置を講じることができます:
ファイルヘッダーの取得や特定の条件の検証など、データを読み取る前にファイルで前処理を実行する必要がある場合は、データの最初の行を読んだ後にファイルポインターを前方に移動できます。
CSVファイルを処理する場合、ファイルポインターの場所に基づいて一部のデータが読み取られているかどうかを確認できます。たとえば、 FTELL()関数の返品値に基づいて、ファイルの終了がファイルの終了に達したかどうか、または無効なデータをスキップする必要があるかどうかを判断できます。
CSVファイルの一部のコンテンツを複数回読み取ることができる場合(ヘッダーデータや特定の特定の行など)、キャッシュを使用してデータを一時的に保存して、不必要な繰り返し測定値を避けることができます。
<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">// 最初の列の値に基づいて処理されたかどうかを判断します。</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">// データの処理</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>
ファイルが読み取られたら、ファイルポインターの場所に特に注意を払う必要があります。場合によっては、 FGETCSV()は、ファイルの最後にある空の行または特定の文字のために早期に終了し、 Falseを返しなくなります。この時点で、 Feof()関数を使用して、ファイルの終了が到達したかどうかを確認するか、 fgetcsv()に依存してfalseを返して端をマークします。
FGETCSV()は強力な機能ですが、ファイルポインターを正しく管理することは、データの正確な読み取りを確保するための鍵です。 ftell()やfseek()などの関数を使用することにより、ファイルポインターの位置を正確に制御し、繰り返し測定値を回避したり、データをスキップしたりできます。さらに、キャッシュと論理的判断の合理的な使用は、読み取り効率をさらに改善し、不必要なリソース消費を減らすことができます。この記事のスキルを通じて、 FGETCSV()の使用をより適切にマスターし、より複雑なCSVファイルを処理できることを願っています。