2016-03-25 16 views
1

FILE2のFILE1にあるすべての行を削除します。file2に存在するfile1の行を削除してください。

私はこのコードを使用してみましたが、成功しませんでした:

機能:

function removeit($searchfor, $file) { 
    $file1 = fopen($file, "r") or exit("Unable to openfile!"); 
    $t=""; 
    while(!feof($file1)) { 
     $k= fgets($file1); 
     $pattern = preg_quote($searchfor, '/'); 
     $pattern = "/^.*$pattern.*\$/m"; 
     if (preg_match($pattern, $k)) 
     {} 
     else { 
     $t=$t.$k; 
     } 
    } 

    fclose($file1); 
    $file = fopen($file, "w") or exit("Unable to open file!"); 
    fwrite($file,$t); 
    fclose($file); 
} 

仕事をするコード:

$file = fopen("file1.txt", "r"); 
while(!feof($file)) { 
    $line = fgets($file); 
    # do same stuff with the $line 
    echo removeit(trim($line), 'file2.txt'); 
} 
fclose($file); 

をしてください任意のこのコードの修正?またはこの仕事を適切に行うための他の方法がありますか? 私は正しい結果を得るためにあらゆる種類のコードを試しましたが、私が試みたことはすべて成功しませんでした。

FILE2に存在するFILE1の行は、フルラインに含まれていません!ここで

例:

FILE1:

AAA 
BBB 
CCC 
DDD 

そして、ここでFILE2:

555AAAPPP // This line contain AAA line1 of FILE1 (To remove) 
MMMBBBEEE // This contain BBB (To remove) 
111CCC333 // This contain CCC (To remove) 
DD15568 // This line will not be removed because not present on FILE1 

そして、コードはそれのようなコード滞在を聞かせなければなりません前に、あったラインは取り除かなければなりません。

+0

あなたの質問は私には不明である:あなたは '555AAAPPP'を削除するか、しないかをしたいですか? – Reversal

+0

はい、3つのすべての行を削除する必要があり、それはFILE1 :) –

+0

のErkの行が含まれているため、これを行うしないでください: '$ファイル=のfopenのを($ファイル、「W」)' - あなたはタイプを変更しています変数のその代わりに、文字列には '$ filename'、ハンドルに対しては' $ file'のようなものを使用してください。ややこしい。 –

答えて

1

これは動作します:

var_dump(CheckForMatches::run("FILE1", "FILE2")); 

class CheckForMatches 
{ 
    private static $arrayBasePatterns; 
    private static $arrayScanFile; 

    public static function run($baseFile, $targetFile) 
    { 
     self::$arrayBasePatterns = file($baseFile, FILE_IGNORE_NEW_LINES); 
     self::$arrayScanFile  = file($targetFile, FILE_IGNORE_NEW_LINES); 

     $cleanedResult = array_filter(self::$arrayScanFile, 
             "CheckForMatches::arrayCallback"); 
     return $cleanedResult; 
    } 

    public static function arrayCallback($arrayElement) 
    { 
     foreach (self::$arrayBasePatterns as $basePattern) 
     { 
      if (strpos($arrayElement, $basePattern) !== FALSE) 
      { 
       return FALSE; 
      } 
     } 
     return TRUE; 
    } 
} 
+0

これは問題を解決しました、ありがとうございます。 –

関連する問題