提问人:Guillaume 提问时间:3/30/2022 更新时间:3/31/2022 访问量:207
我应该使用“fgetcsv”而不是“array_map”吗?
Should I use "fgetcsv" instead of "array_map" and how to do it?
问:
我制作了这个脚本来从 CSV 文件中提取数据。
$url = 'https://flux.netaffiliation.com/feed.php?maff=3E9867FCP3CB0566CA125F7935102835L51118FV4';
$data = array_map(function($line) { return str_getcsv($line, '|'); }, file($url));
它完全按照我的意愿工作,但我刚刚被告知这不是正确的方法,我真的应该改用。fgetcsv
这是对的吗?我尝试了很多方法来做到这一点,但根本没有设法接近任何东西。fgetcsv
这是我想作为输出获得的示例:
$data[4298][0] = 889698467841
$data[4298][1] = Figurine Funko Pop! - N° 790 - Disney : Mighty Ducks - Coach Bombay
$data[4298][2] = 108740
$data[4298][3] = 14.99
答:
1赞
Selim Acar
3/30/2022
#1
首先,在编程中没有一种正确的方法来做事。这取决于您,并取决于您的用例。
我刚刚下载了CSV文件,它大约有20MB大。在您的解决方案中,您可以一次下载整个文件。如果您没有任何内存限制,并且不必向调用者提供快速反馈,我的意思是,如果下载整个文件的延迟并不重要,那么如果您想保证整个内容的处理,您的解决方案是更好的解决方案。在这种情况下,您可以一次阅读所有内容,并且内容的进一步处理不依赖于其他内容,例如您的 Internet 连接等。
如果要使用 ,则应按顺序逐行读取 URL。您的连接必须保持,直到处理完一条线路。在这种情况下,您不需要大量的内存分配,但处理整个内容需要更长的时间。fgetcsv
这两种方法都有其优点和缺点。你应该知道你的目标是什么。您多久运行一次此脚本?您应该考虑您的用例,并决定哪种方法最适合您。
这是相同的结果,没有:array_map()
$url = 'https://flux.netaffiliation.com/feed.php?maff=3E9867FCP3CB0566CA125F7935102835L51118FV4';
$lines = file($url);
$data = [];
foreach($lines as $line)
{
$data[] = str_getcsv(trim($line), '|');
//optionally:
//$data[] = explode('|',trim($line));
}
$lines = null;
评论
0赞
Guillaume
3/30/2022
实际上,我从XML转向CSV方法,因为废弃CSV显然比XML快得多。然后我在这里发布了关于如何对压缩文件做同样事情的信息(仍在寻找一种方法......),两个成员告诉我,我真的不应该使用array_map来做这件事。非常感谢您的回答和解释。
0赞
Selim Acar
3/31/2022
@Guillaume的性能可能较低,您可以通过循环实现相同的性能。 恕我直言,可以/应该用于比解析单个 CSV 行更复杂的算法,以便您的主代码保持可读性和干净。顺便问一下,你是什么意思?array_map()
foreach
array_map
how to do the same with compressed file
0赞
Selim Acar
3/31/2022
@Guillaume,我通过解析循环中的行来更新我的答案。foreach
评论