[FGETCSVとfSeek関数は、CSVファイルの特定の場所でデータを読むために連携する方法は? ]
PHPでは、CSVファイルを処理するときに、通常、 FGETCSV()関数を使用して、ファイル内のすべてのデータ行を読み取ります。ただし、ファイルの最初の数行をスキップしたり、特定の場所からデータの読み取りを開始したりすることができる場合があり、 fseek()関数が機能します。これら2つの機能を一緒に使用することにより、読み取りデータの開始位置を正確に制御できるため、大きなファイルまたは特定のデータをより効率的に処理できます。
FGETCSV()は、PHPの組み込み関数の1つであり、通常、CSV形式のファイルを読み取るために使用されます。ファイルポインターの現在の位置からのデータの行を読み取り、配列に解析します。各配列要素は、CSVファイルの列に対応します。 FGETCSV()の基本的な使用法は次のとおりです。
<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">// データの各わかりましたを処理します</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()は3つのパラメーターを受け入れることができます。
ハンドル:オープンファイルリソース。
長さ:読み取るバイトの最大数。
Delimiter :Delimiter、デフォルトはコンマです。
fseek()関数は、ファイルポインターの位置を調整するために使用され、ファイル内の特定のバイト位置に移動できます。 fseek()の基本的な使用法は次のとおりです。
<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>$ハンドル:ファイルハンドル。
$ offset :オフセット、移動するバイト数を示します。
SEEK_SET :オフセットがファイルの先頭から計算されることを示します。他の一般的に使用される定数には、 SEEK_CUR (現在の位置に対する)およびSEEK_END (ファイルの終了に対して)が含まれます。
fseek()とfgetcsv()を組み合わせて使用することにより、CSVファイルの特定の場所からデータの読み取りを開始できます。 CSVファイルの最初の10行をスキップしてから、11行目のデータの読み取りを開始するとします。特定の実装は次のとおりです。
<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">// 使用fseek前にスキップします10わかりました</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">// 逐わかりました读取并跳过</span></span><span>
}
</span><span><span class="hljs-comment">// から11わかりました开始读取数据</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">// データの各わかりましたを処理します</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">"ファイルを開くことができません!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>この例では、最初にfseek() (またはfgets() )を使用して最初の10行のデータをスキップし、次にFGETCSV()を使用して、ファイルポインターの現在の位置からデータを読み取り、処理します。
大規模なファイルの処理:大規模なCSVファイルの場合、 fseek()を使用すると、不要な部品をスキップし、必要なデータのみを読み取ることができます。たとえば、タイトル行、空白行、またはファイルで処理されたデータ行をスキップします。
CSVデータへのランダムアクセス:CSVファイルの特定の場所からデータの読み取りを開始するか、指定された行の列を読み取る必要がある場合があります。この要件は、fseek()オフセットを合理的に設定することで簡単に実現できます。
パフォーマンスの向上:ファイル全体をゼロから読み取る必要がない場合、 fseek()を使用してファイルの特定の場所を直接見つけることができ、不要なデータの読み取りを減らしてプログラムのパフォーマンスを改善できます。
ファイルポインターの問題: fseek()が呼び出されると、ファイルポインターの現在の位置が変更され、その後の読み取り操作が新しい位置から開始されます。したがって、 fseek()を使用すると、ファイルポインターが読み始めたい正しい場所に配置されていることを確認してください。
fseekのオフセット: fseek()のオフセットはバイトにあるため、CSVファイルを処理する場合、ファイル行の長さが一貫性がない場合、エラーを引き起こす可能性があります。これを回避するために、通常、 FGETS()を使用して行をスキップするか、ファイル内の各行の長さが比較的均一であることを確認します。
ファイル開きモード:Fileを読み取りモード( R )で開くようにしてください。そうしないと、 FSEEK()を使用してファイルポインターを調整できません。
fgetcsv()とfseek()を組み合わせることにより、CSVファイルの特定のデータをより柔軟に読み取ることができます。 fseek()は、ファイルポインターの位置を正確に制御する機能を提供しますが、 fgetcsv()は、 CSVファイルの各行を配列に解析するのに役立ちます。 2つの組み合わせは、大きなファイルを処理したり、ランダムアクセスを実行したりするときに、効率を効果的に改善できます。