web-dev-qa-db-ja.com

PHP:ファイルから特定の行を読み取る

Phpを使用してテキストファイルから特定の行を読み取ろうとしています。テキストファイルは次のとおりです。

foo  
foo2

Phpを使用して2行目のコンテンツを取得するにはどうすればよいですか?これは最初の行を返します:

<?php 
$myFile = "4-24-11.txt";
$fh = fopen($myFile, 'r');
$theData = fgets($fh);
fclose($fh);
echo $theData;
?>

..しかし、2番目が必要です。

どんな助けも大歓迎です

52
Sang Froid
$myFile = "4-24-11.txt";
$lines = file($myFile);//file in to an array
echo $lines[1]; //line 2

ファイル—ファイル全体を配列に読み込みます

81
user557846

omgコメントをする7人の担当者が不足しています。これは@Raptorと@Tommのコメントです。この質問はまだGoogle Serpsでかなり高い値を示しているからです。

彼はまさに正しい。小さいファイルの場合、file($file);で十分です。大きなファイルの場合、b/c php配列は完全に過剰になり、メモリをクレイジーに消費します。

ファイルサイズが〜67mb(1,000,000行)の* .csvで小さなテストを実行しました。

$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デスクトップにあったので、実稼働環境を代表するものではありませんが、それでもかなり違いがあります。

31
nimmneun

そのようにしたい場合は...

_$line = 0;

while (($buffer = fgets($fh)) !== FALSE) {
   if ($line == 1) {
       // This is the second line.
       break;
   }   
   $line++;
}
_

または、 file() で開き、_[1]_で行に添え字を付けます。

16
alex

SplFileObjectクラスを使用します...

$file = new SplFileObject("filename");
if (!$file->eof()) {
     $file->seek($lineNumber);
     $contents = $file->current(); // $contents would hold the data from line x
}
11
Phil

次を使用して、ファイル内のすべての行を取得できます

$handle = @fopen('test.txt', "r");

if ($handle) { 
   while (!feof($handle)) { 
       $lines[] = fgets($handle, 4096); 
   } 
   fclose($handle); 
} 


print_r($lines);

および$lines[1] 2行目

9
balanv
$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);
6
Phoenix

LinuxでPHPを使用する場合、次を試して、たとえば74行目から159行目までのテキストを読むことができます。

$text = Shell_exec("sed -n '74,159p' path/to/file.log");

このソリューションは、ファイルが大きい場合に適しています。

3
mineroot

ファイルの終わりまでファイルをループする必要があります。

  while(!feof($file))
  {
     echo fgets($file). "<br />";
  }
  fclose($file);
2
Rikesh

EOFではなく、目的の行までループして、変数をその行にリセットする(追加しない)ことができます。あなたの場合、2行目はEOFです。 (forループは、おそらく以下の私のコードでより適切です)。

この方法では、ファイル全体がメモリ内にありません。欠点は、目的のポイントまでファイルを検索するのに時間がかかることです。

<?php 
$myFile = "4-24-11.txt";
$fh = fopen($myFile, 'r');
$i = 0;
while ($i < 2)
 {
  $theData = fgets($fh);
  $i++
 }
fclose($fh);
echo $theData;
?>
1
Devin Camenares

Stream_get_lineを使用:stream_get_line —ストリームリソースから特定の区切り文字までの行を取得しますソース: http://php.net/manual/en/function.stream-get-line.php

1
Sunit

この質問は今ではかなり古いですが、非常に大きなファイルを扱う人のために、前のすべての行を読む必要のないソリューションがあります。これは、私の場合、約1億6千万行のファイルで機能する唯一のソリューションでもありました。

<?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文字を読み取り、そのデータから最初の完全な行を取得します。

1
cantelope

daggett answer が好きですが、ファイルのサイズが十分でない場合に試すことができる別の解決策があります。

$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));
1
drugan