# String in Datei finden und ersetzen



## Schaaaf (9. Aug 2010)

Hallo,

ich möchte in einer Datei alle Strings "gesucht" finden und sie durch den String "gefunden" ersetzen. Hier der Code zum Finden des Strings:


```
public static void StringSuchen() throws IOException
	{
        String pattern = "gesucht";
        File file = new File("C:/Datei.txt");
        FileReader freader = new FileReader(file);
        BufferedReader reader = new BufferedReader(freader);
 
        while(true)
        {
        	String line = reader.readLine();
        	if(line != null)
        	{
        		if(line.indexOf(pattern) > -1)
        		{
        			System.out.println(line.indexOf(pattern)); //String gefunden
            		}
        	}
        else break;			
        }
	}
```

Wie ersetze ich den jetzt und suche weiter?

Kann mir jemand helfen?


----------



## Gast2 (9. Aug 2010)

Ich würde die Datei zunächste komplett zeilenweise einlesen (ArrayList z.b.).
Danach jede Zeile untersuchen und ggf. den String ersetzen und zum Schluss wieder alles zurückschreiben.


----------



## ProgX (9. Aug 2010)

Wieviele Zeilen hat denn dein File bei dem du ersetzen willst?


----------



## ARadauer (9. Aug 2010)

genau unter deinem thread gibts einen http://www.java-forum.org/allgemeine-java-themen/103746-dateiinhalt-kopieren.html
du machst genau das selbe.. plus befor du die zeile schreibst machst du ein replace...


```
line = line.replace("bier", "wein");
```


----------



## bygones (9. Aug 2010)

wobei da dann lieber [c]replaceAll[/c]


----------



## ARadauer (9. Aug 2010)

bygones hat gesagt.:


> wobei da dann lieber [c]replaceAll[/c]



stimmt!


----------



## Schaaaf (10. Aug 2010)

Danke klappt super. Allerdings tritt da grad noch ein Problem auf:
Die Textdatei ist spaltenweise aufgebaut (also: text1 tab text2 tab text3 tab..). Nun würde ich gerne die zweite Spalte, also text2 löschen und einen tab mitwegnehmen...
Jemand eine Idee?


----------



## Ullenboom (10. Aug 2010)

Zwischenspeicherung ist keine Lösung bei großen Dateien! Ich empfehle einen Pattern-Matcher, der dir etwas über die Suchpositionen aussagt. Die Teile vor dem "Match" schreibst du in die Datei, das gefunden String ersetzt du.

Siehe Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 4.6 Reguläre Ausdrücke oder auch http://download-llnw.oracle.com/javase/1.4.2/docs/guide/nio/example/Grep.java.

Grüße

 Christian


----------



## Schaaaf (10. Aug 2010)

Okay. und wie kann ich jetzte gezielt das löschen wars zwischen den beiden ersten Tabulatoren steht + einen Tabulator davon?


----------



## bygones (10. Aug 2010)

Schaaaf hat gesagt.:


> Okay. und wie kann ich jetzte gezielt das löschen wars zwischen den beiden ersten Tabulatoren steht + einen Tabulator davon?



bei der struktur von text1 tab text2 tab text3 tab:


```
s.replaceAll("(.+)?\t(.+)?\t(.+)?\t", "$1\t HIER ERSETZT \t$2\t")
```


----------



## Schaaaf (11. Aug 2010)

Okay?! Kannst du mir jetzt noch erläutern, was das bedeutet? 
    \t ist mir klar, ist ein Tab


----------



## bygones (11. Aug 2010)

Schaaaf hat gesagt.:


> Okay?! Kannst du mir jetzt noch erläutern, was das bedeutet?
> \t ist mir klar, ist ein Tab




```
s.replaceAll("(.+)?\t(.+)?\t(.+)?\t", "$1\t HIER ERSETZT \t$3\t")
```
Bedeutet soviel wie etwa:

Es kommen irgendwelche Zeichen, dann ein tab (text1 tab)
dann kommen wieder irgendwelche Zeichen, dann ein Tab (text2 tab)
und nochmal irgendwelche Zeichen, dann ein tab (text3 tab)

durch die Klammerung werden die jeweiligen text_n Blöcke gruppiert und man kann dann im replace Schritt per $n daraufzugreifen.

Der replace schritt heisst also:
1. Gruppe (text1) tab TEXT_ANSTELLE_TEXT2 tab 3. Gruppe (text3)

$2 ist falsch, da es sich ja um die zu ersetzende gruppe handelt


----------

