PHP - 如何打开文件并读取它们然后用每个文件写“x”行写新文件?

时间:2010-09-11 14:28:50

标签: php glob

我之前在这里发过这个问题,但没有回复。我可能做错了所以,这里再说一些细节。

目录中的文件名为1.txt,2.txt,3.txt等....下面的代码段进入该目录,打开读取它们的所有*,txt文件,删除欺骗并创建一个文件所有独特的内容。 (在这种情况下的名称)。

$files = glob($dirname."/*.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($dirname."/allofthem.txt", implode("\n", $lines));
    }

以上作品对我很有用!感谢stackoverflow的大力帮助。

但是,我希望更进一步。

而不是一个大的重复免费“allofthem.txt”文件,如何修改上面的代码来创建每个新数据最多5oo行的文件?

他们需要进入一个新的目录,例如$ dirname。“/ done /".$ i。”。txt“我已经尝试计算循环,但我的努力没有奏效,最终只有一英里长。< / p>

我还尝试将500推入数组,增加到另一个数组并保存。没运气。我只是没有“得到”它。

同样,这位初学者需要一些专家帮助。提前谢谢。

3 个答案:

答案 0 :(得分:5)

根据代码获得行数组后,可以使用array_chunk将其分成500行,然后将每个块写入自己的文件:

// ... from your code
$lines = array_unique($lines);

$counter = 1;
foreach (array_chunk($lines, 500) as $chunk)
{
  file_put_contents($dirname . "/done/" . $counter . ".txt", implode("\n", $chunk));
  $counter++;
}

答案 1 :(得分:1)

这个功能会让你到达某个地方!

function files_identical($fn1, $fn2) {
    if(filetype($fn1) !== filetype($fn2))
        return FALSE;

    if(filesize($fn1) !== filesize($fn2))
        return FALSE;

    if(!$fp1 = fopen($fn1, 'rb'))
        return FALSE;

    if(!$fp2 = fopen($fn2, 'rb')) {
        fclose($fp1);
        return FALSE;
    }

    $same = TRUE;
    while (!feof($fp1) and !feof($fp2))
        if(fread($fp1, 4096) !== fread($fp2, 4096)) {
            $same = FALSE;
            break;
        }

    if(feof($fp1) !== feof($fp2))
        $same = FALSE;

    fclose($fp1);
    fclose($fp2);

    return $same;
}

Src:http://www.php.net/manual/en/function.md5-file.php#94494

答案 2 :(得分:0)

$files = glob($dirname."/*.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);
$lines_per_file = 500;
$files = count($lines)/$lines_per_file;
if(count($lines) % $lines_per_file > 0) $files++;
for($i = 0; $i < $files; $i++) {
    $write = array_slice($lines, $lines_per_file * $i, $lines_per_file);
    file_put_contents($dirname."/done/".$i.".txt", implode("\n", $write));
}