Я пытаюсь прочитать определенную строку из текстового файла, используя php. Вот текстовый файл:
foo foo2
Как получить содержимое второй строки с помощью php? Это возвращает первую строку:
<?php $myFile = "4-24-11.txt"; $fh = fopen($myFile, 'r'); $theData = fgets($fh); fclose($fh); echo $theData; ?>
.. но мне нужно второе.
Любая помощь будет принята с благодарностью
$myFile = "4-24-11.txt"; $lines = file($myFile);//file in to an array echo $lines[1]; //line 2
file – считывает весь файл в массив
Если бы вы хотели сделать это так …
$line = 0; while (($buffer = fgets($fh)) !== FALSE) { if ($line == 1) { // This is the second line. break; } $line++; }
Кроме того, откройте его с помощью file()
и подстройте строку с помощью [1]
.
omg Мне не хватает 7 отзывов, чтобы комментировать. Это комментарий @ Raptor & @ Tomm, так как этот вопрос по-прежнему обнаруживает высокий уровень в google-серпах.
Он прав. Для file($file);
небольших файлов file($file);
отлично. Для больших файлов это полный избыток b / c php-массивов питает память, как сумасшедшую.
Я просто провел крошечный тест с * .csv с размером файла ~ 67 мб (1 000 000 строк):
$t = -microtime(1); $file = '../data/1000k.csv'; $lines = file($file); echo $lines[999999] ."\n".(memory_get_peak_usage(1)/1024/1024) ."\n".($t+microtime(1)); //227.5 //0.22701287269592 //Process finished with exit code 0
И так как никто еще не упомянул об этом, я дал попробовать SplFileObject
, который я на самом деле недавно открыл для себя.
$t = -microtime(1); $file = '../data/1000k.csv'; $spl = new SplFileObject($file); $spl->seek(999999); echo $spl->current() ."\n".(memory_get_peak_usage(1)/1024/1024) ."\n".($t+microtime(1)); //0.5 //0.11500692367554 //Process finished with exit code 0
Это было на моем рабочем столе Win7, поэтому оно не является репрезентативным для производственной среды, но все-таки … в этом разница.
вы можете использовать следующее, чтобы получить все строки в файле
$handle = @fopen('test.txt', "r"); if ($handle) { while (!feof($handle)) { $lines[] = fgets($handle, 4096); } fclose($handle); } print_r($lines);
и $lines[1]
для вашей второй линии
$myFile = "4-21-11.txt"; $fh = fopen($myFile, 'r'); while(!feof($fh)) { $data[] = fgets($fh); //Do whatever you want with the data in here //This feeds the file into an array line by line } fclose($fh);
в$myFile = "4-21-11.txt"; $fh = fopen($myFile, 'r'); while(!feof($fh)) { $data[] = fgets($fh); //Do whatever you want with the data in here //This feeds the file into an array line by line } fclose($fh);
Я бы использовал класс SplFileObject …
$file = new SplFileObject("filename"); if (!$file->eof()) { $file->seek($lineNumber); $contents = $file->current(); // $contents would hold the data from line x }
Если вы используете PHP в Linux, вы можете попробовать следующее, чтобы прочитать текст, например, между 74-й и 159-й строками:
$text = shell_exec("sed -n '74,159p' path/to/file.log");
Это решение хорошо, если ваш файл большой.
Вы должны зацикливать файл до конца файла.
while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file);
вwhile(!feof($file)) { echo fgets($file). "<br />"; } fclose($file);
Использовать stream_get_line: stream_get_line – Получает строку из ресурса потока до заданного разделителя Источник: http://php.net/manual/en/function.stream-get-line.php
Вы можете попробовать выполнить цикл до нужной строки, а не EOF, и каждый раз возвращать переменную в строку (не добавляя к ней). В вашем случае вторая строка – EOF. (Возможно, в моем коде ниже подходит цикл «А»).
Таким образом, весь файл не находится в памяти; недостаток – это время, чтобы пройти через файл до нужной вам точки.
<?php $myFile = "4-24-11.txt"; $fh = fopen($myFile, 'r'); $i = 0; while ($i < 2) { $theData = fgets($fh); $i++ } fclose($fh); echo $theData; ?>
Мне нравится ответ daggett, но есть еще одно решение, которое вы можете попробовать, если ваш файл недостаточно велик.
$file = __FILE__; // Let's take the current file just as an example. $start_line = __LINE__ -1; // The same with the line what we look for. Take the line number where $line variable is declared as the start. $lines_to_display = 5; // The number of lines to display. Displays only the $start_line if set to 1. If $lines_to_display argument is omitted displays all lines starting from the $start_line. echo implode('', array_slice(file($file), $start_line, lines_to_display));
Этот вопрос довольно старый, но для тех, кто имеет дело с очень большими файлами, вот решение, которое не связано с чтением каждой предыдущей строки. Это было единственное решение, которое работало в моем случае для файла с ~ 160 миллионами строк.
<?php function rand_line($fileName) { do{ $fileSize=filesize($fileName); $fp = fopen($fileName, 'r'); fseek($fp, rand(0, $fileSize)); $data = fread($fp, 4096); // assumes lines are < 4096 characters fclose($fp); $a = explode("\n",$data); }while(count($a)<2); return $a[1]; } echo rand_line("file.txt"); // change file name ?>
в<?php function rand_line($fileName) { do{ $fileSize=filesize($fileName); $fp = fopen($fileName, 'r'); fseek($fp, rand(0, $fileSize)); $data = fread($fp, 4096); // assumes lines are < 4096 characters fclose($fp); $a = explode("\n",$data); }while(count($a)<2); return $a[1]; } echo rand_line("file.txt"); // change file name ?>
Он работает, открывая файл, не читая ничего, затем мгновенно перемещая указатель в произвольную позицию, считывая до 4096 символов с этой точки, а затем захватывая первую полную строку из этих данных.