【问题标题】:Parsing and Writing Files in PHP在 PHP 中解析和写入文件
【发布时间】:2014-04-02 07:08:56
【问题描述】:

我试图打开一个充满文本文件的目录,然后逐行读取每个文件,将每行中的信息写入一个新文件。在我尝试迭代的目录中的每个文本文件中,信息的格式如下:

JunkInfo/UserName_ID_Date_Location.Type

所以我想打开这些文本文件中的每一个,并以如下形式在我的新文件中写入一行:

UserName,ID,Date,Location,Type

这是我目前想出的代码:

<?php

$my_file = 'info.txt';
$writeFile = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file); //implicitly creates file

$files = scandir('/../DirectoryToScan');
foreach($files as $file)
{
    $handle = @fopen($file, "r");
    if ($handle) 
    {
        while (($buffer = fgets($handle, 4096)) !== false) 
        {
            $data = explode("_", $buffer);
            $username = explode("/", $data[0])[1];
            $location = explode(".", $data[3])[0];
            $type = explode(".", $data[3])[1];

            $stringToWrite = $username . "," . $data[1] . "," . $data[2] . "," . $location . "," . $type;

            fwrite($writeFile, $stringToWrite);
        }

        if (!feof($handle)) 
        {
             echo "Error: unexpected fgets() fail\n";
        }
        fclose($handle);
    }
}

fclose($writeFile);
?>

所以我的问题是,这似乎不起作用。我只是从来没有发生过任何事情——输出文件从未被写入,我不知道为什么。

【问题讨论】:

  • $files 数组是否包含您认为的内容?在 foreach 循环之前尝试 print_r($files) 以查看其中的内容。
  • 此外,您可以抑制fopen 调用可能发生的任何错误,并且您不会处理$handle 无效的情况。这些可能是您需要捕获的错误情况。
  • 是的 - 刚刚检查了一下,$files 似乎得到了我需要的东西。

标签: php file-io


【解决方案1】:

scandir() 行存在一个潜在问题:

$files = scandir('/../DirectoryToScan');

路径以/ 开头,这意味着它正在查找服务器的根目录。所以,它试图读取的目录是/DirectoryToScan。要修复它,您只需删除前导 /。当然,这可能是此示例的示例路径,可能实际上并不适用于现实,或者您的系统根目录中确实有一个名为 that 的目录 - 在这些情况下,请随意忽略此位 =P。

接下来是当您对正在迭代的文件使用fopen() 时。 scandir() 返回文件的名称,而不是完整路径。您每次都需要连接目录名称和文件:

$dir = '../DirectoryToScan/';
$files = scandir($dir);
foreach($files as $file) {
    $handle = @fopen($dir . $file, "r");

我目前正在运行旧版本的 PHP,因此直接从返回函数访问数组索引,例如使用 explode("/", $data[0])[1],对我不起作用(它是在 PHP 5.4 中添加的)。

除此之外,您的其余代码看起来应该可以正常工作(减去我可能忽略的任何潜在逻辑/数据错误)。

【讨论】:

  • 啊——通过修改我的代码将目录名连接到文件名上,就像你的例子解决了我的问题一样!非常感谢您的帮助!
  • @JToland 没问题,很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2020-01-05
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多