我有一个将数据列表导出到.txt文件的程序,很多数据都是不需要的。每个数据的格式都是这样的:
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的记录。因此,如果它搜索并找到带有CLASS的广告记录从零开始,它将删除该记录中的所有内容。如果它是.xml,这很容易,但它是一个.txt文件,所以它会让事情变得困难。一旦它删除了所有不良数据,它就会将好数据保存在新文件中。
答案 0 :(得分: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');
答案 1 :(得分: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');