【问题标题】:Combine / merge all files in dir into one text file将目录中的所有文件合并/合并到一个文本文件中
【发布时间】:2013-06-03 03:43:07
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

  • 为什么不简单地fwrite($out, file_get_contents($file))?将循环体减少到一行。
  • 这段代码不会抛出错误吗? fread() 需要两个参数。 . .我会改用file_get_contents。您也不会读取任何 .txt 文件,因为您的 glob 模式仅匹配两个字符扩展名。
  • 您的代码似乎没问题。您可以随时添加 echo "open:", $file;echo "write:", $line; 来查看 PHP 正在做什么(一步一步)
  • 我还建议不要根据别人对您的 other question 的回答创建新问题。
  • @Jon 修复了它。你能把它写成答案让我选择吗?

标签: php string file text


【解决方案1】:

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

foreach ($files as $file) {
    fwrite($out, file_get_contents($file));
}

【讨论】:

  • 如果您要处理大文件,最好的策略是什么?
  • @rbassett 在这种情况下file_get_contents 不是正确的工具。以较小的块流式传输内容,例如stream_copy_to_stream.
【解决方案2】:

您的代码有 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]*");
    

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多