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
세상에, 저는 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
'programing' 카테고리의 다른 글
SQL 방법 관련 테이블에서 최신만 선택 (0) | 2023.07.30 |
---|---|
NumPy 배열의 모든 셀에서 함수의 효율적인 평가 (0) | 2023.07.25 |
파이썬에서 사용자 이름과 암호를 안전하게 저장해야 하는데, 옵션은 무엇입니까? (0) | 2023.07.25 |
재할당 후 버퍼의 데이터가 손실됩니까? (0) | 2023.07.25 |
PowerShell에서 함수 오버로드 (0) | 2023.07.25 |