我的目标是从第三方web服务器获取一个zip文件,获取其中包含的CSV文件并遍历内容,将其逐行放入数组中进行进一步处理。
我正在抓取的文件大约有2000行长。
这是我目前拥有的::
$zip = URL_TO_FILE;
$internal_file = 'zipped_file_name.csv';
$ext = pathinfo($zip, PATHINFO_EXTENSION);
$temp = tempnam(sys_get_temp_dir(), $ext);
copy($zip, $temp);
$file = file_get_contents("zip://$temp#$internal_file");
上述工作,但似乎并不理想。通常,我抓取一个解压缩的CSV文件,并简单地遍历其内容,然后将内容放入一个数组中。
while ( ($line = fgetcsv($file)) !== false ) {
if ( array(0 => null) !== $line ) {
$result[] = $line;
}
}
我不确定如何与抓取压缩内容的额外步骤做同样的事情。另外-我只需要文件的最后100行,而不是所有2000行。
- 是否有更好的方法来做到这一点?
- 我如何只抓取最后100行?
- 我如何通过内容逐行迭代将其放入数组?
感谢!
经过一番搜索,我找到了解决方案::
foreach(preg_split("/(('r?'n)|('r'n?))/", $file) as $line){
$result[] = $line;
}
这将遍历从文件中检索到的每一行内容。之后,我所做的就是对数组进行拆分以获得最新信息::
$newArray = array_slice($result, 0, 10);
对于那些不想把这些拼凑在一起的人来说,下面是一个块中的代码::
$zip = $object->getUrl();
$file = '649.csv';
$ext = pathinfo($zip, PATHINFO_EXTENSION);
$temp = tempnam(sys_get_temp_dir(), $ext);
copy($zip, $temp);
$file = file_get_contents("zip://$temp#$file");
unlink($temp);
foreach(preg_split("/(('r?'n)|('r'n?))/", $file) as $line)
{
$result[] = $line;
}
fgetcsv
函数需要文件句柄。所以用fopen
代替file_get_contents
:
$fh = fopen("zip://$temp#$internal_file", "r");
while( ($line = fgetcsv($fh)) !== false) {
...
}