# Zwei Textdateien vergleichen



## Popcorn (4. Juni 2013)

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
> ...



*zweitens.txt * mit dem Inhalt:


> ein
> sommerlicher




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:


```
$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


----------



## sheel (4. Juni 2013)

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

```
sommerlicher
ein
```
ist und trotzdem das gleiche Ergebnis rauskommt?


----------



## jeipack (4. Juni 2013)

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 


```
$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);
```


----------



## Popcorn (5. Juni 2013)

Wow, das ging ja flott mit den Antworten.



sheel hat gesagt.:


> Hi und Willkommen bei tutorials.de,
> 
> sind die Zeileninhalte in sich auch wichtig oder gehts nur um "ganze Zeile gleich: ja/nein"?
> 
> ...



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:

```
foreach($handle_erstens => $erste_zeile)
```

ausgehend von dem vollständigen PHP-Code:


```
$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);
```


----------



## Yaslaw (5. Juni 2013)

Viel zu kompliziert. Arrays sind sehr mächtig.

```
//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

```
//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;
```


----------



## Popcorn (5. Juni 2013)

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


----------



## Yaslaw (5. Juni 2013)

SOllte eigentlich auch mit Zahlen funktionieren. Mach mal ein Beispiel


----------



## jeipack (5. Juni 2013)

```
//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.


----------

