使用PHP根据时间从.txt文件中删除行

时间:2012-08-18 19:12:25

标签: php unix time code-snippets

我正在开展一个小项目。

我想做的是,有一个PHP文件,根据时间从.txt文件中删除行

.txt文件的格式如下

Content | Time (Unix Time)
Content | Time (Unix Time)

每次执行php文件时,我希望它删除每行=或小于当前时间

我尝试使用谷歌,并且没有运气,我从一个来源拉动时间。所以这不会成为问题,只需PHP部分。

有片段吗?或者这会很困难。

3 个答案:

答案 0 :(得分:2)

有很多方法可以解决这个问题......除非您的文件非常大,否则实际上很容易。这种方法不是最有效的内存,但它可能是最简单的。

将文件读入包含file()的行数组,循环遍历它们并在|上分别展开。如果时间戳比当前时间更新,则将该行添加到输出数组。

最后,使用输出数组的值写回文件:

$output = array();
// Read the file into an array of lines:
$lines = file('yourfile.txt');
// Store the current time
$now = time();

foreach ($lines as $line) {
  // Split on |
  list($content, $time) = explode("|", $line);
  if ($time > $now) {
     // Keep the line in the output array:
     $output[] = $line;
  }
  // Otherwise do nothing with it
}

// Implode it back to a string and write to file:
$outstring = implode("\n", $output);
file_put_contents("yourfile.txt", $outstring);

确保yourfile.txt具有对您的Web服务器用户或执行此脚本的任何用户的相应写入权限。

答案 1 :(得分:1)

您可能需要查看fgetcsvfputcsv。您可以使用前者循环浏览文件中的所有行,过滤掉不符合条件的行,并将所有未被过滤器捕获的行放回文件中。

<?php
$filtered = array();
if($handle = fopen("data.txt", "r")){
    while($data = fgetcsv($handle, 0, "|")){
        if($data[1] > time()){
            $filtered[] = $data;
        }
    }
    fclose($handle);
}
if($handle = fopen("data.txt", "w")){
    for($i = 0; $i < count($filtered); $i += 1){
        fputcsv($handle, $filtered[$i], "|");
    }
}
?>

答案 2 :(得分:1)

要改进@ Michael的答案,而不是将所有内容保存在内存中,请使用两个文件流并编写从第一个到第二个匹配的行。这将允许您处理任意大文件。您也可以编写stdout,因为大多数应用程序默认执行,并将输出重定向到文件。

$input = fopen("file.txt", "rb");
$output = fopen("output.txt", "wb");
$now = time();

while ($row = fgets($input))
{
    list($content, $time) = explode("|", $row);

    if ($time > $now)
    {
        // change to echo to write to stdout
        fwrite($output, $row);
    }
}

fclose($input);
fclose($output);