programing

PHP: 파일에서 특정 행 읽기

closeapi 2023. 7. 25. 20:59
반응형

PHP: 파일에서 특정 행 읽기

저는 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 - 전체 파일을 어레이로 읽습니다.

세상에, 저는 7명의 대표자가 부족해서 댓글을 달 수 없습니다.이것은 @Raptor & @Tomm의 코멘트입니다. 이 질문은 여전히 구글의 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

Windows 7(윈도우 7) 데스크톱에 설치되어 있어서 운영 환경을 대표하지는 않지만...상당한 차이

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

$line = 0;

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

또는 다음을 사용하여 열어서 줄에 다음을 추가합니다.[1].

SplunkFileObject 클래스를 사용합니다.

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

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

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

이 질문은 지금까지 꽤 오래되었지만, 매우 큰 파일을 다루는 사람들을 위해, 여기 앞의 모든 줄을 읽지 않는 해결책이 있습니다.이 솔루션은 또한 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자를 읽은 다음 해당 데이터에서 첫 번째 전체 줄을 잡는 방식으로 작동합니다.

Linux에서 PHP를 사용하는 경우 74행과 159행 사이의 텍스트를 읽기 위해 다음을 시도할 수 있습니다.

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

파일이 큰 경우 이 솔루션이 좋습니다.

당신은 파일이 끝날 때까지 파일을 순환시켜야 합니다.

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

나는 단답형 답변을 좋아하지만 당신의 파일이 충분히 크지 않다면 당신이 시도할 수 있는 다른 해결책이 있습니다.

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

사용 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;
?>

언급URL : https://stackoverflow.com/questions/5775452/php-read-specific-line-from-file

반응형