我的文件安排如下:
“url1”,“info1”
“url2”,“info2”
“url3”,“info3”......一直到“url15”,“info15”
我想将文件的最后10行读入一个数组,以便$ pagelist [0] [0]将给出url5和$ pagelist [0] [1]将给出info5。
我目前的代码如下:
$file=fopen(csvfile.txt,"r");
$pagelist=array();
$i=0;
$key=0;
while (!feof($file)) {
if ($i >= (count($file)-11)) {
$pagelist[$key]=fgetcsv($file);
$key++; }
$i++;
}
fclose($file)
当我使用print_r($ pagelist)时,它似乎已经将文件的所有行加载到数组中,而不是仅仅是最后的10行。任何人都可以在我的代码中看到我做错了什么?谢谢:))
答案 0 :(得分:3)
您的代码问题是count($file)
没有按您的想法行事。 $file
只是一个文件句柄资源,而不是数组。您最终会比较$i >= -11
,这当然总是会评估为true
/
如果您想使用linux来获取最后十行(不确定您是否使用Linux),您可以尝试这样的事情:
$initial_csv = 'csvfile.txt';
$truncated_csv ='csvfile_trun';
$number_of_lines_from_end = 10;
shell_exec('tail -n ' . $number_of_lines_from_end . ' ' . $initial_csv . ' > ' . $truncated_csv);
$file=fopen($truncated_csv,"r");
$pagelist=array();
$i=0;
while (!feof($file)) {
$pagelist[$i]=fgetcsv($file);
$i++;
}
fclose($file)
或者,如果你不介意将整个文件放在内存中(即文件仍然很小),你可以将整个文件读成这样的数组。
$csv = 'csvfile.txt';
$number_of_lines_from_end = 10;
$file_array = file($csv);
$line_count = count($file_array);
$start = $line_count - $number_of_lines_from_end - 1;
$pagelist=array();
for ($i = $start; $i < $line_count; $i++) {
$pagelist[]=fgetcsv($file);
}
答案 1 :(得分:0)
又一个实现,为了它的乐趣(迈克的tail
可能是最快的):
$storage = new SPLFixedArray(10);
$i = 0;
while(($line = fgets($file)) && ++$i) {
$storage[$i%10] = $line;
}
$storage = $storage->toArray();
//switch if order is important;
$prepend = array_splice($storage,($i%10)+1,10 - ($i%10));
array_splice($storage,0,0,$prepend);
//interpret csv
$result = array_map('str_getcsv',$storage);
答案 2 :(得分:-1)
$file=fopen(csvfile.txt,"r");
$pagelist= [];
$temp = fgetcsv($file);
array_merge($pagelist, $temp);
fclose($file);
print_r($pagelist);
$lastten = array_slice($pagelist, -10, 10);
print_r($lastten);
*切片偏移和限制我可能错了。