# Zeilen in .txt Datei löschen



## 127.0.0.1 (3. Apr 2012)

Hi Leute,

ich habe ein kleines Problem, oder einen Denkfehler in meinem Programm und wollte fragen ob mir jemand von euch helfen kann.
Ich versuchs kurz zu machen 


*Ich möchte eine Textdatei einlesen, die ersten Zeilen löschen, und dann die Datei speichern*

Habe schonmal etwas rumgespielt:


Die Datei hat gleich als erstes 12 Zeilen, die alle mit "! *" anfangen, also Ausrufezeichen, Leerzeichen, Sternchen

```
StringBuffer sb = new StringBuffer();
inn = new BufferedReader(new FileReader("Datei"));

for (String line; (line = inn.readLine()) != null;) {

if(line.startsWith("! *"))
{
	int bisEnde = line.length();
	sb.delete(0, bisEnde);


}
```
(klammern schließen, und noch n bissle Code davor und dannach is klar ^^)

*Das funktioniert auch schon so wie ich das möchte, aber er löscht mir nicht alle Zeilen, die letzte bleibt immer stehen ! Warum ?!*


----------



## SlaterB (3. Apr 2012)

an deinen Code ist wenig verständlich, der StringBuffer sb wird angelegt und ist immer leer, 
nichts kommt hinein, wieso wird dort delete aufgerufen?

und würde delete(0, bisEnde) nicht nur genau dann funktionieren, wenn die aktuelle Zeile auch genau am Beginn des StringBuffers steht?
ist das für alle Zeilen immer so und wenn ja kann warum/ kann man dann nicht einfach den aktuellen Inhalt des StringBuffers komplett ignorieren?

Datei speichern erfordert noch eigenen Code, das weißt du hoffentlich, nur in Java Strings hin und her zu speichern ändert die Datei nicht,
warum die letzte Zeie anders behandelt werden sollte, ist abgesehen von den genannten Merkwürdigkeiten (vielleicht das Löschen genau am Anfang des Buffers) nicht zu erkennen,

logge doch erstmal in der Schleife, ob jede Zeile dort ankommt,  und logge dann wie jede verarbeitet wird, 
wie z.B. der Buffer vor und nach einem remove aussieht, ob die richtige Zeile oder nicht ganz was anderes gelöscht wird,
Standardbehandlung für alle Fehler


----------



## 127.0.0.1 (3. Apr 2012)

hm, danke schonmal


das schwierige is, dass ich das meiste vom Code nich zeigen kann (Firma und so).

Aber das programm an sich läuft, also alles funktioniert,
das lesen, das ändern, das Speichern und so

schwierig zu verstehen, ich weiß

Und das mit dem delete vom StringBuffer geht auch, aber eben nur 10 Zeilen, dann hört er einfach auf, obwohl es doch noch 2 Zeilen gibt

Wenn ich zwischendrin mit "System.out.println" prüfe ob er überhaupt die Zeilen findet, dann klappt das, er findet alle Zeilen, und gibt mir sogar die richtige Länge aus


???:L


----------



## nillehammer (3. Apr 2012)

Der Code macht so nicht viel Sinn, weil Du versuchst, aus einem StringBuffer etwas zu löschen, obwohl der garnicht gefüllt ist. Genau anders wird ein Schuh draus.
- Wenn die Zeile NICHT mit "! *" startet, dann appende sie zum StringBuffer
In Code sieht das dann so aus:

```
StringBuffer sb = new StringBuffer();
BufferedReader inn = new BufferedReader(new FileReader("Datei"));

for (String line; (line = inn.readLine()) != null;) {

  if (!line.startsWith("! *")) {

    sb.append(line);
  }
}
```


----------



## 127.0.0.1 (3. Apr 2012)

ok, hab deinen Code ma ausprobiert, also das mit dem 


```
if (!line.startsWith("! *")) {
 
    sb.append(line);
  }
```

funktioniert so wie es soll, aber er fügt einfach nur alles außer das was ich nich haben will nochmal ein.
Hab jetzt also meine ersten 12 Zeilen nur einmal dastehen, die anderen alle doppelt ^^

da fehlt dann doch noch was im Code oder ?


----------



## SlaterB (3. Apr 2012)

ja, da fehlt z.B. deine bisherigen appends zu entfernen ,

in unbekannten Code einzugreifen ist nunmal ein Lauf mit verbundenen Augen über heiße Kohlen,
da kannst du nicht zuviel erwarten


----------



## 127.0.0.1 (3. Apr 2012)

SlaterB hat gesagt.:


> in unbekannten Code einzugreifen ist nunmal ein Lauf mit verbundenen Augen über heiße Kohlen,
> da kannst du nicht zuviel erwarten



ja, weiß ich, geht aber nicht anders, sry

aber ich finde es läuft recht gut ^^
Zumindest bin ich einige Schritte weiter


----------



## nillehammer (3. Apr 2012)

Aha, Du hast den StringBuffer also schon befüllt und zwar einerseits mit Zeilen, die Du drinnen haben willst und andererseits mit Zeilen, die Du *nicht* drinnen haben willst. Die Zeilen, die nicht rein sollen, willst Du nun in einem zweiten Schritt wieder heraus löschen und hast dafür mal Code ausprobiert, der leider nicht funktioniert wie erwartet.

Da würde ich doch eher den Ansatz verfolgen, den StringBuffer nur mit den Zeilen zu füllen, die auch tatsächlich rein sollen. Dafür war mein Code ein Beispiel. Versuch bitte auf der Schiene weiter zu machen.

In einem StringBuffer nach Zeichenketten suchen, die entfernt werden sollen, ist ohne Umweg garnicht möglich. Denkbar wäre, ihn in einem String zu speichern und mit replaceAll unter Verwendung eines passenden Regex-Patterns zu arbeiten. Ist aber alles unnötig, wenn Du schon beim Einlesen vernünftig filterst.


----------



## 127.0.0.1 (3. Apr 2012)

ok, dank dir _nillehammer_, ich denke an der Stelle werd ich weitermachen

Mal ne andere Idee, über die ich auch schon nachgedacht hab:
Kann man irgendwie sagen dass die ersten 12 Zeilen gelöscht werden, egal was drin steht ?
Weil ich weiß dass es immer 12 Zeilen sind.

Also ein Befehl um X Zeilen zu löschen.

Mein Freund google kann mir leider nicht weiterhelfen


----------



## SlaterB (3. Apr 2012)

'löschen' meinst du hoffentlich wie aktuell gelernt als 'gar nicht erst in StringBuffer einfügen',
du kannst eine Laufvariable zeilenAnzahl mitzählen und dann noch das berühmte if verwenden


----------



## nillehammer (3. Apr 2012)

> Kann man irgendwie sagen dass die ersten 12 Zeilen gelöscht werden, egal was drin steht ?
> Weil ich weiß dass es immer 12 Zeilen sind.
> 
> Also ein Befehl um X Zeilen zu löschen.


Aus dem StringBuffer nur über den Umweg String und replaceAll oder indexOf mit passendem Pattern . Ein StringBuffer hat keine Idee, was eine Zeile ist. Für den sind es einfach ein Haufen chars, auf die man allenfalls per Index zugreifen kann.

Du könntest allerdings statt in einen StringBuffer die Zeilen in eine List<String> einlesen. Da kannst Du dann sehr einfach die ersten zwölf Einträge löschen.

Die richtige Filterung beim Einlesen halte ich aber für den besten Weg. Beim Einlesen kannst Du, wie schon von SlaterB geschrieben, innerhalb der Schleife eine Zählvariable hochzählen und erst dann an den StringBuffer appenden, wenn die Zählvariable größer als die auszulassende Zeilenanzahl ist.


----------



## 127.0.0.1 (4. Apr 2012)

oh man !
Nach 2 Tagen intensiver Fehlersuche hab ich es nun endlich beheben können !
Funktioniert nun ^^

Woran's lag:

Musste einfach nur den Codeblock:

```
if (!line.startsWith("! *")) {

//hier mein restlicher Code

}
```
um mein anderen Code packen !

Mehr nicht........
irgendwie deprimierend, wenn man bedenkt wieviel Zeit man verschwendet hat ^^
aber so is das in java nun mal 


*Danke an alle für die gute, und auch schnelle Hilfe !*

Gruß


----------

