# [PHP] Aus einer Textdatei ALLE Zeilenumbrüche entfernen



## micha (25. März 2004)

Hi Leute,

wie kann ich via PHP aus einer Textdatei sämtliche Zeilenumbrüche löschen (oder durch eine Zeichencombo ersetzen um sie später wieder identifizieren zu können) ?

Müsste im Grunde via fopen und dann eine preg_replace mit der Info \n gehen, wenn ich mich nicht täusche oder ?

Wenn ja, wie sieht dann der korrekte Syntax aus ?
Gibt es Alternativen?

Danke für die Hilfe,

Micha


----------



## Operator_Jon (25. März 2004)

Ich würde dir vorschlagen das ganze Teil einzulesen -> file("bla.txt)", dann per preg_replace oä die Umbrüche ersetzen und die komplette Datei wieder zu überschreiben!

Außerdem:
Selber ausprobieren bringts


----------



## micha (25. März 2004)

Keine Angst, ich bin schon kräftig am Selbst probieren, würde ich keine Hilfe oder Anregungen gebrauchen, würde ich mich nicht an Euch wenden.

Mit File wird das ganze Ding in ein Array geschrieben, das ist für meinen Zweck unbrauchbar.
Er soll ja die Gesamte Datei 1:1 in eine Variable posten.
Wenn ich die dann Echoe, dann soll er den gesamten Inhalt der Datei posten.
Wenn ich mit File arbeite müsste ich das Array dann wieder imploden, das sind ein paar Schritte zuviel.

Ich teste gerade mit Readfile($Pfad_zum_File)
Aber da stürzt der Browser ab.

Und mein Zeilenumbruchgenudel sieht so aus:

```
preg_replace ("/\\015\\012|\\015|\\012/", "[DOENER]", $file);
```

Ich werde mal weiterarbeiten, sollte einer von Euch jedoch auch schonmal soetwas gemacht haben, gebt mir doch einfach mal Eure Erfahrung damit zurück. Benötige nützliche Tipps. Erschwerend kommt ja hinzu, dass die Datei 15000 Zeilen hat.


----------



## Sanic (25. März 2004)

Hast du in diesem Zusammenhang schon einmal fopen und fread probiert ?
Dann könntest du ja mit str_replace()  ( nach "\n" suchen und durch "" ersetzen ) die Umbrüche raussuchen.
Zurück speichern dann mit fwrite und voilá ( hoffe doch)


----------



## stanleyB (25. März 2004)

http://de.php.net/manual/de/function.file-get-contents.php

file_get_contents() liest dir die komplette Datei in einen String ein.
Darueber noch ein passendes Suchmuster laufen lassen und fertig.

sB!


----------



## micha (25. März 2004)

Also ich habe nun folgendes gemacht:
In der XLS Datei,die ich später exportiere eine Weitere Spalte angehängt, die [ENDE] enthält.

Ich parse aus der ersten Spalte alle \012 und \015er raus und schreibe dann den Inhalt der 2ten Spalte dahinter: [ENDE]
Im nächsten Schritt ersetze ich [ENDE] durch einen \015er und habe somit jede Zeiler der Exceldatei in einer Zeile der CSV Datei (Obwohl die Spalte A in der EXCELTabelle mit ALT+ENTER eingefügte Zeilenumbrüche enthielt).

Hier der Quellcode.


```
$file = file($csv_url); //array: einträge sind die zeilen der datei
$spalten = explode($seperator,$file[0]); //erste zeile (überschriften)
for($i=1;$i<count($file);$i++){ // alfred auf
  $temp = explode($seperator,$file[$i]);
   $eintraegeohnebr = preg_replace ("/\015\012|\015|\012/", "[DOENER]", $temp[0]);
  //$bramende = preg_replace ("/[ENDE]/", "\015", $temp[$i]);
  $einedatenbankzeile = "$eintraegeohnebr $temp[1] $temp[2]";
```

Im nächsten Schritt muss ich nun eine neue Textdatei anlegen, die für jedes $i eine Zeile mit dem Inhalt $einedatenbankzeile enthält.

Hier der Quellcode.


```
// Inhalte nun in eine Datei schreiben	 
	  $filename = 'csvinfosohnebr.txt';//D:\phpmysqlwebserver\minixampp\htdocs\
      $somecontent = $einedatenbankzeile;
	  // Sichergehen, dass die Datei existiert und beschreibbar ist
	  if (is_writable($filename)) {
   	 // Wir öffnen $filename im "Anhänge" - Modus.
   	 // Der Dateizeiger befindet sich am Ende der Datei, und
  	 // dort wird $somecontent später mit fwrite() geschrieben.
  	   if (!$handle = fopen($filename, "a")) {
           print "Kann die Datei $filename nicht öffnen";
           exit;
  	   }
  	 // Schreibe $somecontent in die geöffnete Datei.
  	   if (!fwrite($handle, $somecontent)) {
         print "Kann in die Datei $filename nicht schreiben";
         exit;
      }
  	   print "Fertig, in Datei $filename wurde $somecontent geschrieben";
  	   fclose($handle);
	  } else {
   	    print "Die Datei $filename ist nicht schreibbar";
	  }
	  //echo $filewithnoBR;  
   
	} // alfred zu
```

Dummerweise habe ich nun 3700 Zeilen anstatt der erwarteten 1280. Muss ich nochmal drüber schaun.

Danke aber erstmal für Eure Tipps. Werde meine weiteren Lösungen dennoch posten, damit - sollte jemand mal die Suchen Funktion benutzen und das gleiche Problem wie ich haben - er vielleicht die Lösung auf sein Problem mit meinem Code finden kann.

// edit 

Die Abfrage von über 15000 Zeilen und ersetzen ist so langsam, dass mein Browser jedesmal abschmiert.
Hier nochmal das preg_replace durch str_replace ausgetauscht um Geschwindigkeit gut zu machen. Ebenfalls sind die ORs entfallen und durch \r\n ersetzt worden.


```
$eintraegeohnebr =str_replace("/\r\n/", "[DOENER]", $temp[0]);
```


----------



## micha (25. März 2004)

Okay, nun funktioniert es in akzeptabler Geschwindigkeit.
Er entfernt auch alle Zeilenumbrüche. Bis auf eine Art.
Ich habe zur Verdeutlichung nochmal einen Screenshot angehängt.
Die rot gekennzeichneten Asciis scheinen ebenfalls einen Zeilenumbruch zu bewirken. Diese müssen ebenfalls durch [DOENER] ersetzt werden.

Hier nochmal der aktuelle und funktionsfähige Code, der alles bis auf die rot gekennzeichneten Asciis entfernt.


```
} // form zu
	if($action=='insert'){ // alfred alt auf
	  echo "<table class='font'><tr><td>";
	  $file = file($csv_url); //array: einträge sind die zeilen der datei
	  $spalten = explode($seperator,$file[0]); //erste zeile (überschriften)
	  for($i=1;$i<count($file);$i++){ // alfred auf
	  $temp = explode($seperator,$file[$i]);
	  $eintraegeohnebr =preg_replace("/\15\12|\15|\12/", "[DOENER]", $temp[0]);
	  //$bramende = preg_replace ("/[ENDE]/", "\015", $temp[$i]);
	  $einedatenbankzeile = "$eintraegeohnebr $temp[1] $temp[2]";
      // Inhalte nun in eine Datei schreiben	 
	  $filename = 'csvinfosohnebr.txt';//D:\phpmysqlwebserver\minixampp\htdocs\
      $somecontent = $einedatenbankzeile;
	  // Sichergehen, dass die Datei existiert und beschreibbar ist
	  if (is_writable($filename)) {
   	 // Wir öffnen $filename im "Anhänge" - Modus.
   	 // Der Dateizeiger befindet sich am Ende der Datei, und
  	 // dort wird $somecontent später mit fwrite() geschrieben.
  	   if (!$handle = fopen($filename, "a")) {
           print "Kann die Datei $filename nicht öffnen";
           exit;
  	   }
  	 // Schreibe $somecontent in die geöffnete Datei.
  	   if (!fwrite($handle, $somecontent)) {
         print "Kann in die Datei $filename nicht schreiben";
         exit;
      }
  	   print "Fertig, Zeile ".$i." wurde bearbeitet<br>";
  	   fclose($handle);
	  } else {
   	    print "Die Datei $filename ist nicht schreibbar";
	  }
	  //echo $filewithnoBR;  
   
	} // alfred zu
	echo "</tr></td></table>";
	}// alfred alt zu
```

Meine Frage:

Wie erreiche ich, dass auch die letzen Zeilenumbrüche entfernt werden.
Hier nochmal die Zeile, in der ich die Zeielenumbrüche entferne:

```
preg_replace("/\15\12|\15|\12/", "[DOENER]", $temp[0]);
```

// edit

Das geht mit Microsoft Word.
suche ersetzen / erweitert / absatzmarken entfernen

@ Mod: Thread closeable


----------



## myplex (25. März 2004)

Probiere es mal mit der ersetzen funktion
(siehe php.net)
Du musst dann folgendes z.B. eingeben:
\n soll durch (nichts) ersetzt werden. Dan werden diese Daten weiter ohne Zeilenumbrüche verarbeitet !


----------

