我正在尝试打开一个充满文本文件的目录,然后逐行读取每个文件,将每行中的信息写入新文件。在我试图迭代的目录中的每个文本文件中,信息形成如下:
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);
?>
所以我的问题是,这似乎不起作用。我从来没有发生任何事情 - 输出文件永远不会被写入,我不知道为什么。
答案 0 :(得分:1)
scandir()
行存在一个潜在问题:
$files = scandir('/../DirectoryToScan');
路径以/
开头,这意味着它正在查找服务器的根目录。因此,它尝试读取的目录是/DirectoryToScan
。要解决此问题,您只需删除前导/
即可。当然,这可能是此示例的示例路径,可能实际上并不适用于现实,或者您可能确实在系统的根目录中有一个名为的目录 - 在这些情况下,可以随意忽略此位= 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中)。
除此之外,其余的代码看起来应该可以正常工作(减去我可能忽略的任何潜在的逻辑/数据错误)。