2014-12-11 2 views
1

У меня есть файл, который я разбираю с 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); 
+3

Возможно, вы захотите использовать ['trim'] (http://php.net/manual/en/function.trim.php) содержимое файла, прежде чем пытаться найти последнюю строку. – Glen

+0

, но действительно ли он загружает его полностью в память? Я думаю, что я запутался в том, как использовать рычаги так. – Mike

+0

Попробуйте '$ trimmed_contents = trim (file_get_contents ('testfile.txt'));' – Glen

ответ

0

Вы можете использовать следующий подход, который не загружает весь файл в памяти (можно обрабатывать очень большие файлы с ней) и позволяет иметь пустые строки в любом месте файла, а не только в конце ,

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

Этот код итерацию по каждой строке, а затем проверяет, является ли строка не равна \n ни \r и если это не так, он обрабатывает строки, в противном случае он просто отбрасываются и код скачет на следующая строка.

Вы также можете использовать новый интерфейс SplFileObject введена в PHP 5.1.0, код очень похож и работает точно так же:

$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" 
} 

Это не может быть лучшим решением точки зрения производительности, но это, безусловно, самый простой, для более эффективных методов на получение последней строки я отсылаю вас к this question, который имеет довольно длинные и сложные решения, которые должны были бы изменения, если вы хотите чтобы игнорировать пустые строки.

+0

Но с вашим первым подходом fgets начинается с вершины файла, нет? Похоже, много переработанной обработки. – Mike

Смежные вопросы