Ответ 1
$myFile = "4-24-11.txt";
$lines = file($myFile);//file in to an array
echo $lines[1]; //line 2
Я пытаюсь прочитать определенную строку из текстового файла, используя 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
Если вы хотите сделать это таким образом...
$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);
отлично. Для больших файлов это полный избыток 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);
Я бы использовал класс 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);
Использовать stream_get_line: stream_get_line - Получает строку из ресурса потока до заданного разделителя Источник: http://php.net/manual/en/function.stream-get-line.php
Вы можете попробовать выполнить цикл до нужной строки, а не EOF, и каждый раз возвращать переменную в строку (не добавляя к ней). В вашем случае вторая строка - EOF. (В цикле A, вероятно, более подходит в моем коде ниже).
Таким образом, весь файл не находится в памяти; Недостатком является то, что вам нужно время, чтобы пройти файл до нужной вам точки.
<?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 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
?>
Он работает, открывая файл, не читая ничего, затем мгновенно перемещая указатель в произвольную позицию, считывая до 4096 символов с этой точки, а затем захватывая первую полную строку из этих данных.