我想从列表A中删除列表B和文本文件中的项目。
例如:a.txt
1
3
6
b.txt
2
3
6
我之前尝试了不止一种方法,但对于大文件来说,它并没有发挥应有的作用。
$a = file('a.txt', FILE_IGNORE_NEW_LINES);
$b = file('b.txt', FILE_IGNORE_NEW_LINES);
$n = 'new.txt';
for ($i = 0;$i < count($b);$i++)
{
if (!in_array($b[$i], $a))
{
$c = file_get_contents($n);
$c .= $b[$i] . "\n";
file_put_contents($n, $c);
}
}
有没有更好的方法来处理80k行这样的大文件?
这段代码主要是改变了文件的读写方式,使第二个文件每次只读1行,而不是全部在内存中读。 输出也使用了 FILE_APPEND
在 file_put_contents()
以便它不需要再次读取该文件。
第一部分是创建一个a.txt文件的数组,以该值为索引,让你可以使用 isset()
而非 in_array()
这样会使搜索速度快很多。
然后每次读取第二个文件1行,检查是否存在,如果需要就添加数据......
$fileA = fopen('a.txt', 'r');
$a = [];
while($entry = fgets($fileA))
{
$a[trim($entry)] = true;
}
$fileB = fopen('b.txt', 'r');
$n = 'new.txt';
// Clear the file
file_put_contents($n, '');
while($b = fgets($fileB))
{
if (!isset($a[trim($b)]))
{
file_put_contents($n, $b, FILE_APPEND);
}
}