Zwei Textdateien vergleichen

Popcorn

Grünschnabel
Nabend,
ich habe zurzeit eine kleine Denkblockade und sitze am folgenden Problem:

Gegeben sind zwei Textdateien

erstens.txt mit dem Inhalt:
heute
ist
ein
schöner
sommerlicher
abend

zweitens.txt mit dem Inhalt:


Eine Datei namens ergebnis.txt soll von dem PHP-Skript erstellt werden, mit folgendem Inhalt:
heute
ist
schöner
abend

Das heißt, dass mein PHP-Skript alle Gemeinsamkeiten der beiden Dateien löschen soll (zeilenweise).

Habe PHP leider nur oberflächlich in der Schule behandelt, habe aber trotzdem eine Art Grundgerüst:

PHP:
$handle_erstens = fopen("erstens.txt", "r");
$handle_zweitens = fopen("zweitens.txt", "r");
$datei_ausgabe = "ergebnis.txt";
$fp = fopen($datei_ausgabe, "a+");
while (!feof($handle_erstens))
{
	$variable = ....
	...
	fputs($fp, $variable);
}
fclose($handle_erstens);
fclose($handle_zweitens);
fclose($fp);

Aber wie genau gehe ich an die Aufgabe heran? Sind das einfach nur zwei Schleifen, wie sich gegenseitig prüfen? Oder kann man das irgendwie eleganter, ohne einen 100-Zeilen-Code zustande zu bringen lösen?

Liebe Grüße und einen schönen Abend noch
 
Hi und Willkommen bei tutorials.de,

sind die Zeileninhalte in sich auch wichtig oder gehts nur um "ganze Zeile gleich: ja/nein"?

Kann die Reihenfolge der Zeilen unterschiedlich sein?
Also zB., dass Datei 2
Code:
sommerlicher
ein
ist und trotzdem das gleiche Ergebnis rauskommt?
 
Hi
Dafür brauchst du ne zweite Schleife in der ersten über die zweite Datei, die dann Zeile für Zeile vergleicht.
Ich benutze nie Files, deshalb verzeih wenn ich es einfach mit einer pseudocode Foreach schleife mache :)

PHP:
$handle_erstens = fopen("erstens.txt", "r"); 
$handle_zweitens = fopen("zweitens.txt", "r"); 
$datei_ausgabe = "ergebnis.txt"; 
$fp = fopen($datei_ausgabe, "a+"); 
//while (!feof($handle_erstens)
foreach($handle_erstes => $erste_zeile) { 
    var $inErgebnis=false;
    foreach($handle_zweites => $zweite_zeile) {
       if($erste_zeile==$zweite_zeile) {
            $inErgebnis=true;
       }
    }
    if(!$inErgebnis) {
         fputs($fp, $erste_zeile);
    }
} 
fclose($handle_erstens); 
fclose($handle_zweitens); 
fclose($fp);
 
Wow, das ging ja flott mit den Antworten.

Hi und Willkommen bei tutorials.de,

sind die Zeileninhalte in sich auch wichtig oder gehts nur um "ganze Zeile gleich: ja/nein"?

Kann die Reihenfolge der Zeilen unterschiedlich sein?
Also zB., dass Datei 2
Code:
sommerlicher
ein
ist und trotzdem das gleiche Ergebnis rauskommt?

Danke für das Willkommen, lungerte bereits seit längerer Zeit hier als Gast herum

Zu deinen Fragen: Es sollten nur ganze Zeilen verglichen werden. Sprich die Zeilen sollten 1:1 identisch sein. Und ja, die Reihenfolge ist immer unterschiedlich. In dem Beispiel aus dem ersten Post passte es halt von der Reihenfolge her, aber das wird meist nicht der Fall sein.

@ jeipack: Für deinen kompletten Code bekomme ich leider eine Fehlermeldung:
(unexpected T_DOUBLE_ARROW)

Es geht um diese Zeile hier:
PHP:
foreach($handle_erstens => $erste_zeile)

ausgehend von dem vollständigen PHP-Code:

PHP:
 $handle_erstens = fopen("erstens.txt", "r");
 $handle_zweitens = fopen("zweitens.txt", "r");
 $datei_ausgabe = "ergebnis.txt";
 $fp = fopen($datei_ausgabe, "a+");
 foreach($handle_erstens => $erste_zeile)
 {
	var $inErgebnis = false;
	foreach($handle_zweitens => $zweite_zeile)
	{
		if ($erste_zeile == $zweite_zeile)
		{
			$inErgebnis = true;
		}
	}
	if (!$inErgebnis)
	{
		fputs($fp, $erste_zeile);
	}
 }
 fclose($handle_erstens);
 fclose($handle_zweitens);
 fclose($fp);
 
Viel zu kompliziert. Arrays sind sehr mächtig.
PHP:
//Die Dateien als Zeilenarrays einlesen
$rows1 = file('erstens.txt');
$rows2 = file('zweitens.txt');

//Differenz bestimmen
$diffRows = array_diff($rows1, $rows2);

//und wieder in eine Datei schreiben
$datei_ausgabe = "ergebnis.txt";
$fp = fopen($datei_ausgabe, "a+");
foreach($diffRows as $row){
	fputs($fp, $row); 
}
fclose($fp);

Nachtrag: Falls du auch in der zweiten Datei Einträge hast die in der Ersten nicht vorkommen, dann kannst du so die Menge ermitteln
PHP:
//alle die in #1 sind aber nicht in #2
$diffRows1 = array_diff($rows1, $rows2);
//alle die in #2 sind aber nicht in #1
$diffRows2 = array_diff($rows2, $rows1);
//und zusammenführen
$diffRows = $diffRows1 + $diffRows2;
 
Sehr sehr schön! Danke - besonders für die Kommentare! :)

Edit: Sorry, lag an mir, in der ersten Textdatei wurden die Zeilenumbrüche zerschossen... Jetzt klappts
 
Zuletzt bearbeitet:
PHP:
//Die Dateien als Zeilenarrays einlesen
$rows1 = file('erstens.txt');
Das ist cool, werde ich mir merken falls ich doch mal direkt auf Dateien zugreiffen muss.
 
Zurück