수정 PHP:특정 라인에서 파일 읽기




php txt 파일 수정 (10)

SplFileObject 클래스를 사용합니다 ...

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

PHP를 사용하여 텍스트 파일에서 특정 줄을 읽으려고합니다. 다음은 텍스트 파일입니다.

foo  
foo2

PHP를 사용하여 두 번째 줄의 내용을 어떻게 얻을 수 있습니까? 첫 번째 줄을 반환합니다.

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

하지만 두 번째가 필요해.

어떤 도움이라도 대단히 감사하겠습니다.


Answer #1

EOF가 아니라 원하는 라인까지 반복 해보고 매번 변수를 라인에 다시 설정합니다 (추가하지 않음). 귀하의 경우 두 번째 줄은 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;
?>

Answer #2

나는 코멘트를하기 위해 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 데스크탑에 있었기 때문에 프로덕션 환경을 대표하지는 않지만 여전히 차이가 있습니다.


Answer #3

다음을 사용하여 파일의 모든 행을 가져올 수 있습니다

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

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


print_r($lines);

두 번째 줄은 $lines[1]


Answer #4

이 질문은 꽤 오래되었습니다. 그러나 매우 큰 파일을 다루는 사람은 모든 선행 읽기를 포함하지 않는 해결책입니다. 필자의 경우 1 억 6000 만 줄의 파일을 처리하는 유일한 솔루션이기도합니다.

<?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자를 읽은 다음 해당 데이터에서 첫 번째 완전한 행을 가져옵니다.



Answer #6
$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);

Answer #7

그런 식으로하고 싶다면 ...

$line = 0;

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

또는 file() 열고 행을 [1] 입니다.


Answer #8

나는 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));

Answer #9

Linux에서 PHP를 사용하는 경우 예를 들어 74 행과 159 행 사이의 텍스트를 읽으려면 다음을 시도해보십시오.

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

이 솔루션은 파일 크기가 클 경우 유용합니다.





line