3

我正在尝试使用 PHP 将目录中的所有文件合并到一个文本文件中。

所有文件都是文本文件,每行一个单词。

我只需要将它们全部合并到一个包含所有单词的文本文件中,每行一个。

文件扩展名是 5 的 0-5 倍数(.10、.15、.20、.25)和 .txt 文件。

这是我到目前为止所拥有的,但它只生成一个空文本文件。

<?php
$files = glob("./*.??");
$out = fopen("listTogether.txt", "w");
foreach($files as $file){
    $in = fopen($file, "r");
    while($line = fread($in)){
       fwrite($out, $line);
       echo "writing file";
    }
    fclose($in);
}
fclose($out);
?>
<!Doctype HTML>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>file merger</title>
</head>
<body>
    <p>Doo Wop</p>
</body>
 </html>
4

3 回答 3

3

问题是读取/追加循环没有正确读取。如果您不处理非常大的文件,那么您可以将其简化为

foreach ($files as $file) {
    fwrite($out, file_get_contents($file));
}
于 2013-06-06T23:42:29.890 回答
2

您的代码有两个问题:

  • 对 fread() 的调用需要一个参数,该参数指示您可以为该文件读取的最大字符数。它并不优雅,但您可以将其设置为 20 之类的值(如果文件较长,则 while 循环将执行,直到所有内容都被消耗完)。

    while($line = fread($in,20)){
       fwrite($out, $line);
       echo "writing file";
    }
    
  • 这可能是一个问题或注意事项,但您的 glob 声明说“ .??”。因此,您可以捕获“foo.55”之类的文件,但不能捕获“bar.5”或“mine.100”。您可能希望将其更改为“ .[0-9]*”

    $files = glob("./*.[0-9]*");
    
于 2013-06-06T23:43:18.860 回答
1

如果可以(例如,如果您不需要在连接之前处理文件并拥有适当的操作系统),那么真正可取的方法是尽可能接近操作系统来处理它:

exec('cat *.?? > listTogether.txt');

如有必要,您可以在命令本身内更改工作目录(通过附加“ cd /some/other/directory &&”,考虑到有关路径的安全模式限制),或使用chdir().

于 2013-06-07T00:01:00.890 回答