2012-05-16 4 views
0

데이터 목록을 .txt 파일로 내보내는 프로그램이 있습니다. 많은 데이터가 필요하지 않습니다. 데이터의 모든 조각이 같은 포맷 :PHP를 사용하여 텍스트 파일에서 데이터 검색 및 제거

PUB DATE: 03/16/2012 
END DATE: 06/10/2012 
PUB: my company 
ADNUM: 00237978 
CLASS: 0825 
AD TYPE: RE 
COLUMNS: 2.00 
GRAPHIC FILE: some_image.jpg 
AD TEXT: Text 
*** end of ad 

이 같은 20 ~ 50 기록이있을 것이다, 내가 뭘해야에 대한 파일을 검색하고 0으로 시작하는 클래스가 레코드를 삭제합니다. 따라서 CLASS가 0으로 시작하는 광고 레코드를 검색하고 찾으면 해당 레코드에있는 모든 항목이 삭제됩니다. .xml이지만 쉽게 .txt 파일이므로 일을 어렵게 만듭니다. 일단 모든 나쁜 데이터를 삭제하면 좋은 데이터를 새 파일에 저장합니다.

답변

1
$keep = array(); 
$filePath = '/path/to/txt/file.txt'; 
$textData = file_get_contents($filePath); 
$records = explode('*** end of ad', $textData); 
foreach ($records as $record) { 
    if (empty($record)) { 
     continue; 
    } 

    if (! preg_match('/CLASS:\s+?0/', $record)) { 
     $endDate = array(); 
     preg_match('/END\sDATE:\s?\d{0,2}\/\d{0,2}\/\d{0,4}/', $record, $endDate); 
     if (! empty($endDate)) { 
      $parts = explode(':', $endDate[0]); 
      $dateString = trim($parts[1]); 
      $date = DateTime::createFromFormat('d/m/Y', $dateString); 
      $currentDate = new Date(); 
      $currentDate->setTime(0, 0, 0); 
      if ($currentDate->format('U') > $date->format('U')) { 
       continue; 
      } 
     } 
     $keep[] = $record; 
    } 
} 
file_put_contents($filePath, implode('*** end of ad', $keep) . '*** end of ad'); 
+0

는 매력처럼 일했습니다! – jardane

+0

수정 된 버전으로 현재 날짜 이후의 종료 날짜가있는 레코드를 제거하는 방법이 있습니까? – jardane

+0

@jardane 어떤 PHP 버전을 사용하고 있습니까? – message

0
$keep = array; 
foreach(explode('*** end of ad', file_get_contents($filePath) as $record): 
    if(!preg_match('^CLASS:\s*0825'/, $record)) 
    $keep[] = $record; 
endforeach; 

file_put_contents($filePath, implode('*** end of ad', $keep) . '*** end of ad'); 
+0

나는 그것이 나에게 모든 종류의 오류를 제공하는 코드를하려고 할 때. – jardane

+1

@ jardane 그래서 그들을 고친다 – miki

+0

그것이 틀린 이유를 분명히 말하면서, 나의 프로그램은 그 잘못을 말하지 않는다. 배열 끝에()가 필요하다는 것을 알고 있지만 foreach 모양이 적합을 던지고 있습니다. – jardane

관련 문제