2016-07-20 8 views
2

私はcsvファイルから素早く読み込む方法を見つけようとしています。最初に数行をスキップし、約20行を読み込み、読み込みを停止します。今は唯一の解決策はfreadを使用しており、これはかなり非効率的です。PHPが読み込み中にスキップする

+3

なぜフリーダイヤルを避けるのですか?それは 'fgetcsv()'が内部的に使用するものです。それらの行は、改行がどこにあるかを知るために、phpに読み込まなければなりません。それらの行をスキップ/無視することを選択した場合、それはPHPの問題ではなく、データが読み込まれることになります。 –

+0

ファイル全体を 'file()'で配列に読み込んだり、 'array_slice()'を使って必要な行を取得することができます。 – Barmar

+0

しかし、ファイルが大きければ、それはより遅く無駄になります。あなたの元の方法はおそらく最高です。 – Barmar

答えて

1

を挿入することができます。最速のCSVパーサーはfgetcsvに組み込まれています。同じように使用

function csv_slice($fp, $offset = 0, $length = 0) { 
    $i = 0; 
    while (false !== ($row = fgetcsv($fp))) { 
     if ($i++ < $offset) continue; 
     if (0 < $length && $length <= ($i - $offset - 1)) break; 
     yield $row; 
    } 
} 

$fp = fopen('file.csv', 'r'); 
print_r(
    iterator_to_array(
     csv_slice($fp, 5, 2) // start after 5th row, return 2 rows 
    ) 
); 
fclose($fp); 

私はメモリ消費量を低く抑えるために、ここで発電機を使用しましたしたがって、それはすべての可能な信頼性の高い方法の最速になるだろう。必要に応じて、一時的な配列に簡単に置き換えることができます。

行末に関するいくつかの仮定をすることができれば、行末の範囲を見つけるまでバイト単位で読むことができます。しかし、率直に言って、私はそれをしません。

+0

ありがとう、特に@bishop – Karuhanga

0

file()を試してみてください。それはあなたのファイルのすべての行を読んで、あなたが望むようにそれを読むことができます。たとえば:

$lines = file("myfile.txt"); 
$lineCounter = count($lines); 

if($lineCounter > 20){ 

    $startsAt = 21; //Skip 20 lines 
    for($i = $startsAt; $i < $lineCounter; $i++){ 
     $line = $lines[$i]; 
     //Do whatever you want with the line contents 
    } 

} 
1

は、あなたが

<?php 

    $row = 1; 
    if (($handle = fopen("ptt.csv", "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      $num = count($data); 
      $row++; 

      for ($c=0; $c < $num; $c++) { 
       echo "<TR>"; // OPEN ROW 
       if(strpos($data[$c], 'Finished') !== false) { 
        $c++; 
        echo "<TD nowrap>" . $data[$c] . "</TD>"; 
       }else{ 
        echo "<TD nowrap>" . $data[$c] . "</TD>"; 
       } 
       echo "</TR>"; // CLOSE ROW 
      } 
     } 
     fclose($handle); 
    } 
?> 

以下のコードのこの部分を持っている場合は、

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if($row == 20){ $row++; continue; } 

今whileループの後

if($row == 20){ $row++; continue; } 

を追加した場合のは、言ってみましょう行20から始める場合は、c ontinue reading

別の例を考えてみましょう。あなたは1から始まる40行で読むのをやめたい場合は、特定のCSV形式を尊重CSVをスクロールする唯一の方法は、パーサを呼び出すことです

if($row == 40){ $row++; exit; } 
+0

@ref:http://stackoverflow.com/questions/10901113/skip-the-first-line-of-a-csv-file – unixmiah

関連する問題