2013-02-22 3 views
0

내가 열어 본 파일은 10MB에서 125MB가 될 수 있습니다. 필자는 파일을 여는 다양한 방법을 연구했으며 어떤 것이 최선의 방법이라면 최선의 접근법을 확신 할 수 없습니다. 제발 조언 해!파일의 모든 문자열 찾기

큰 파일을 열고 처음 발생할 때마다 두 문자열 사이의 텍스트를 추출하려고합니다. 첫 번째 문자열을 찾고 두 번째 문자열의 텍스트를 추출 할 수 있지만 내 루프는 그 결과를 12 번 제공합니다 (문자열의 수는이 파일에서 발생합니다.) 나는 루프에서 잘못하고있는 것을 볼 수 있습니다. 첫 번째 발생 및 출력 12 번 반복 어떻게 파일을 반복하고 2-12 번째 항목 사이에 텍스트를 가져올 수 있습니까?

또한 큰 파일을 적절하게 열고 메모리 제한을 처리하는 데 도움이되는 정보는 매우 유용합니다

배열에 넣으면 공백을 잃어 버릴 수 있습니까? PRE를 그대로 사용하면 결과적으로 찾은 각 문자열을 배열이나 db 중 작은 요소로 구문 분석하고 싶습니다. 자신보다 앞서 가고 싶지 않으므로 필요한 경우 배열 주석을 무시하십시오.

<?php 
ini_set('memory_limit', '-1'); 

/* 
Functions 
*/ 

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

/* 
Pre Loop 
*/ 

$string1 = "String 1"; 
$string2 = "String 2"; 

$report = file_get_contents('report.rpt','r'); 

$cbcount = substr_count($report,$string1); 

echo $cbcount; 

/* 
Loop 
*/ 

for ($i=0; $i<$cbcount; $i++){ 

$output = get_string_between($report, $string1, $string2); 

echo "<pre>".$output."</pre>"; 

} 

?> 

답변

2

어떤 종류의 포인터도 실제로 전진하지 않으므로 첫 번째 경기가 이미 발견되었음을 알 수있는 방법이 없습니다.

지금, 귀하의 의견에 따라, 당신은 단지 정규식 사용할 수 있습니다 : 그럼 당신은 var_dump($matches[0]) 당신의 출력을 볼 수 있습니다

(이 함께 전체 루프를 교체)

preg_match_all("(".preg_quote($string1).".*?".preg_quote($string2).")s",$report,$matches); 

합니다. 대신 메모리에 전체 일을 읽는 당신은 줄 단위로 읽어 fopen()fgets()를 사용할 수있는 대용량 파일 처리에 관한

+0

0 => '찾은 문자열'... (길이 = 5048) 출력이 전체 문자열을 표시하지 않는 것처럼 보이는 것처럼 고유한지 확인할 수 없습니다. 위의 형식은 무엇을 의미합니까? 문자열이 "found"로 바뀌 었습니다. 인터넷 검색 ... (길이 = 5048) 아무것도 가져 오지 않습니다. 배열에서 12 개의 문자열을 얻었습니다. 이 말이 맞습니다. – villeneuve97

+0

print_r ($ matches)을 사용했습니다. 나는 전체 문자열을 얻었다. 그것의 모든 거기! 도와 주셔서 감사합니다. – villeneuve97

0
$startfrom = 0; 
while (($start = strpos($string1, $report, $startfrom)) !== false) { 
    $end = strpos($string2, $report, $start); 
    echo "<pre>".substr($report, $start, $end-$start)."</pre>"; 
    $startfrom = $end + 1; 
} 

. $string1을 포함하는 행을 찾으면 $string2 행을 찾을 때까지 변수에 행을 누적하기 시작합니다. 이는 일치 문자열에 개행 문자가 포함될 수없는 경우에만 작동합니다.

+0

나중에 확인하겠습니다. 개행은 fgets()와 다른 것들을 확인하기 위해 필자의 목록에 있었다. 응답 해 주셔서 감사합니다. – villeneuve97

관련 문제