Textfile lesen/schreiben abhängig vom inhalt

dior

Bekanntes Mitglied
Hi,

ich suche schon ne ganze weile in google und dem forum nach einer lösung aber irgendwie steh ich am schlauch...

ich lese eine textdatei ein, und will in eine neue datei schreiben wobei ich aber einige zeilen (abhängig vom inhalt in der entprechenden zeile) nicht mit ausgeben.

z.B.:

inhalt textfile alt:

Heute ist ein schöner Tag
Hello World
Tag ein Tag aus
Wie gewonnen so ...

jetzt möchte ich alle Zeilen weglassen in denen "Tag" vorkommt

Ausgabedatei:

Hello World
Wie gewonnen so ...

Ich habe bis jetzt folgenden Code:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package UserverwaltungGIS;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

/**
 *
 * 
 */
public class Loeschen {

    public static void Loeschen() throws IOException {
    }

    public static void main(String args[]) throws IOException {

        String filePath = "Stapel.txt";
        File file = new File(filePath);
        if (file.isFile()) {
            // Initial setup
            FileInputStream inputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            StringBuilder stringBuilder = new StringBuilder();

            // Read everything into a StringBuilder
            stringBuilder.append(bufferedReader.readLine());
            while (bufferedReader.ready()) {
                stringBuilder.append("\r\n");
                stringBuilder.append(bufferedReader.readLine());
            }
            
            // Write input to File
            try {
           
            // Create file 
            FileWriter fstream = new FileWriter("Stapel2.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(stringBuilder.toString());
            //Close the output stream
            out.close();
        } catch (Exception e) {//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }

            // Print the content of the file on the screen

            System.out.println(stringBuilder.toString());
        }





    }
}


:rtfm:

danke
 
Die Zeilen 38 bis 44 würde ich ersetzen durch:

Java:
BufferedReader bufferedReader = new BufferedReader(...);
    String line = null;
    while ((line = bufferedReader.readLine()) != null) {
      if (line.contains("Tag")) {
        continue; // Zeile enthält Tag, nicht wieder mit ausgeben
      }
     stringBuilder.append("\r\n");
     stringBuilder.append(bufferedReader.readLine());
    }

Aber das kann man ganz gut noch weiter optimieren, z.B., dass du es direkt wieder in die neue Datei schreibst, ohne es im StringBuilder zwischenzuspeichern. Dann kannst du es allerdings wenn du fertig bist, nicht mehr ausgeben, naja. ....

Noch was: das out.close() in Zeile 52 solltest du in den finally-Block des Try-Catches schieben:

Java:
try{...}
catch(Exception e){...}
finally{
if(out != null)
  out.close();
}

So stellt dein Code sicher, dass die Resource, wenn sie geöffnet worde, immer geschlossen wird!
 
Zuletzt bearbeitet:
Hallo Dior,

wir könnten auch eine "loeschen" Methode erstellen, die die "tag"-Zeilen herausfiltert. Beispiel:

Java:
            stringBuilder.append(loeschen(bufferedReader.readLine()));
...
    private static String loeschen(final String line) {
        return line.toLowerCase().contains("tag") ? "" : line + "\r\n";
    }
Gruß,
André
 
Hallo dior,

machs doch einfach so:

Du liest zeile für zeile aus der alten TextDatei aus und schreibst nur die neuen wieder rein:
Java:
// String der in das neue Textdokument geschrieben wird
String toWrite = null; 

 // neuen Reader mit Pfad auf das alte Dokument zum auslesen
BufferedReader in = new BufferedReader(new FileReader("pfadDesDokuments"));

//Überprüfung ob es im Alten Dokument eine weitere Zeile gibt
while ((zeile = in.readLine()) != null){ 

//Überprüfung ob die Zeile "Tag" enthält
if (zeile.contains("tag")){
} // wenn ja mache nichts
else{
File file = new File("Pfad vom neuen Dokument");
FileWriter writer = new FileWriter(file, true);
writer.write("Text"); //Text schreiben
writer.write(System.getProperty("line.separator")); // Absatz machen
} //wenn doch dann schreib sie in das neue dokument.
 
Java:
    while ((line = bufferedReader.readLine()) != null) {
      if (line.contains("Tag")) {
        continue; // Zeile enthält Tag, nicht wieder mit ausgeben
      }
     stringBuilder.append("\r\n");
     stringBuilder.append(bufferedReader.readLine());
}
Damit überspringst du jede zweite Zeile, es wird zweimal readLine aufgerufen.
 
Java:
    while ((line = bufferedReader.readLine()) != null) {
      if (line.contains("Tag")) {
        continue; // Zeile enthält Tag, nicht wieder mit ausgeben
      }
     stringBuilder.append("\r\n");
     stringBuilder.append(bufferedReader.readLine());
}
Damit überspringst du jede zweite Zeile, es wird zweimal readLine aufgerufen.

Richtig! In Zeile 7 muss nur
Code:
line
appendiert werden.
 

Neue Themen


Zurück
Oben