PHP在阅读

时间:2016-07-20 19:28:06

标签: php csv

我试图找到一种快速读取csv文件的方法,首先跳过多行,读取大约20行,然后停止读取。 ryt现在唯一的解决方案是使用fread,效率非常低。

3 个答案:

答案 0 :(得分: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);
    }
?>

如果你添加

    if($row == 20){ $row++; continue; }
在while循环之后

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

现在,假设您想从第20行开始,它将继续阅读

让我们再看一个例子。如果你想从第1行开始停止阅读,你可以插入

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

答案 1 :(得分:1)

滚动查看特定CSV格式的CSV的唯一方法是调用解析器。最快的CSV解析器是内置的case when u.company is null then u.email when trim(u.company) = '' then u.email else u.company end 。因此,这将是所有可能的可靠方法中最快的:

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;
    }
}

我在这里使用了生成器来降低内存消耗。如果您愿意,可以使用临时数组轻松替换。

如果您可以对行结尾做一些假设,那么您可以逐字节读取,直到找到行结尾的范围。但是,坦率地说,我不会这样做。

答案 2 :(得分: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
    }

}