两个csv的差异。内存使用率很高

时间:2018-04-19 16:09:48

标签: php arrays

你帮了我这么多时间,但现在对这个问题我还没有找到解决方案。 我有两个csv,我必须比较并得到差异。 两个csv看起来像这样:

https://stackoverflow.com
https://google.com

这两个文件大约是10 MB

直到现在我做到了:

array1 = array_map('str_getcsv', file(file1));
array2 = array_map('str_getcsv', file(file2));
$diff = array_diff(array_map('serialize',$array1), array_map('serialize',$array2 ));
只要我拥有无限的记忆,它就会非常好用。 这就是问题;-)我没有无限的记忆,因为服务器与befor不同。

现在的问题是:

如何减少它的memory_usage或如何比较两个文件。 请不要考虑文件大小或类似内容。

我需要文件的真正区别。

就像在一个文件中一样

 https://stackoverflow.com 

和另一个

https://google.com

所以区别在于: - )

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

file1读入关联数组的键中。然后逐行阅读file2,从数组中删除这些条目。

$file1 = array_flip(file("file1.csv", FILE_IGNORE_NEW_LINES));
$fd2 = fopen("file2.csv");
$diff = array();
while ($line = fgets($fd2)) {
    $line = str_replace("\n", "", $line); // remove trailing newline
    if (!array_key_exists($line, $file1)) {
        // line is only in file2, add it to result
        $diff[] = $line;
    } else {
        // line is in both files, remove it from $file1
        unset($file1[$line]);
    }
}
fclose($fd2);
// Remaining keys in $file1 are unique to that file
$diff += array_keys($file1); 

如果将第一个文件读入一个数组,然后翻转它就是太多的内存,你也可以使用fgets()循环(但是垃圾收集器应该清理由{{1创建的临时数组) }})。