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