获取忽略空行或空格的文件的最后一行


Get last line of a file ignoring empty lines or whitespace

我有一个文件正在用PHP解析。似乎文件的内容显然以空白的新行结尾,有时带有空格。我怎样才能修剪掉它并获得真正的最后一行?

我的文件有时看起来像

Line 1
Line 2
File content are here 
'n

Line 1
Line 2
File content are here 
'r

或者有时正确的方式

Line 1
Line 2
File content are here 

我需要我的脚本来解析文件的末尾并返回真正的最后一行,即"此处的文件内容"(或任何内容,只是不是空行(。

我使用下面的行来尝试获取最后一行。问题是,我并不总是知道X是什么。即使我认为我知道,文件末尾的换行符和空行也会让我失望。

fseek($file_handle, -X, SEEK_END);

您可以使用以下方法,该方法不会将整个文件加载到内存中(您可以使用它处理非常大的文件(,并允许在文件中的任何位置具有空行,而不仅仅是在末尾。

while (($line = fgets($file_handle)) !== false) {
    if (($line != "'n") && ($line != "'r")) {
        // line is correct, process it
    }
}

此代码遍历每一行,然后检查该行是否不等于 'n 也不等于 'r,如果不是这种情况,它将处理该行,否则它将以静默方式丢弃,代码将跳到下一行。

你也可以使用 PHP 5.1.0 中引入的新SplFileObject接口,代码非常相似,工作方式相同:

$file = new SplFileObject("file.txt");
while (!$file->eof()) {
    $line = $file->fgets();
    if (($line != "'n") && ($line != "'r")) {
        // line is correct, process it
    }
}

我也忽略了一个事实,即在我的答案的第一个修订版中,你只需要最后一行;一个简单的解决方案是在循环中定义一个变量,如果该行是正确的(而不是空的/垃圾的(,如果之后有行,变量会被覆盖,但它将保持在最后一个正确的行上,然后你可以用它做任何你想做的事情。

while (($line = fgets($file_handle)) !== false) {
    if (($line != "'n") && ($line != "'r")) {
        $last = $line
    }
}
if (isset($last)) {
    echo "you've got your last line"
}

在性能方面,这可能不是最好的解决方案,但它绝对是最简单的,为了获得最后一行的更好方法,我向您推荐这个问题,该问题具有相当长且复杂的解决方案,如果您希望它们忽略空行,则需要修改。