获取文件中的所有行,并将唯一行放入新文件中

时间:2010-09-05 20:13:08

标签: php file

使用PHP我已经整天尝试完成这项工作。我失败了。我想:

  1. 打开目录并阅读那里的所有文件。
  2. 逐行读取每个文件内容(每行是一个没有空格的名称(单列))。
  3. 将每一行放入一个新文件(换行换行符)。
  4. 删除重复的行。
  5. 保存新文件。
  6. 对于大师来说很容易,对我来说麻木了。

    注意:每个文件可能长500行,每行20个字符,但只有大约20个文件。

    提前感谢您的帮助。

    再次感谢。 基于下面的帖子我试过

        $topdir = '/home/mycal25/public_html/processed/';
    
    
    $files = glob($topdir."*.txt"); //matches all text files
    
    $lines = array();
    foreach($files as $file)
    {
     $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
    }
    $lines = array_unique($lines);
    
    file_put_contents($topdir."all/all.txt", implode("\n", $lines));
    

    但那不起作用...... 我尝试了其他一些变化无济于事。

4 个答案:

答案 0 :(得分:4)

类似的东西:

$lines = array()
foreach ($files as $file) {
    $lines = array_merge($lines, file($file));
}

$lines = array_unique($lines);

$fp = fopen('dest.txt', 'w');
foreach ($lines as $line) {
    fwrite($fp, $line);
}
fclose($fp);

或者,您可以在每次加载新文件时检查唯一条目的位置不同。这样可以节省RAM,但可能会占用更多的CPU。

根据您对opendir的评论,您可以执行以下操作:

$files = glob('/home/mycal25/public_html/processed/*');

或坚持使用opendir()

$topdir = '/home/mycal25/public_html/processed';
$dh = opendir($topdir);
while (($file = readdir($dh)) !== false) {
    $lines = array_merge($lines, file($topdir . '/' . $file));
}

我在某些地方跳过了一些重要的错误检查,只是为了让代码更简单,更容易阅读。但是如果你想确定,请始终检查opendir / glob / fopen等的返回值

答案 1 :(得分:0)

要指出的是,如果新文件的排序顺序无关紧要,在基于unix的系统上使用sort -u可能会帮助您轻松实现。

如果您在基于unix的主机上运行PHP,则很可能会使用sortsystem()

答案 2 :(得分:0)

8小时并非一无所获;这样想,你肯定讨厌编程!我看到一个非常好的解决方案可能会有一些错误的问题,但所有的想法和大笔画都在那里。您可能只需要对调试方法进行一些改进。

这就是我要做的事情:而不是内联函数调用将它们作为自己的语句写出来,并将它们的返回值保存到有意义的变量中。看看这个:

$topDir = '/home/mycal25/public_html/processed/';

/* Grab names of all needed text files */
$filePaths = glob($topdir . '*.txt');

$names = array();

foreach($filePaths as $filePath) {
    $fileLines = file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
    $names = array_merge($names, $fileLines);
}

$uniqueNames = array_unique($names);

$nameList = implode("\n", $uniqueNames);

file_put_contents($topDir . 'all/all.txt', $nameList);

这是我的个人风格。你现在可以做的是var_dump()每个变量并运行你的脚本。通过这样做,您最终将通过输出找出哪个变量不包含您希望它包含的内容。

此外,请确保已启用所有错误报告。无耻的堵塞:http://www.needtodevelop.com/error-reporting-in-php

答案 3 :(得分:0)

<?php

$lines = array();

foreach($files as $file)
{
    $lines = array_merge($lines, array_fill_keys(file($file, FILE_SKIP_EMPTY_LINES), 1));
}

file_put_contents('file.txt', implode(array_keys($lines)));

?>