Split + Zeilen einer Datei mit bestimmtem Inhalt löschen

Lanzettlich

Mitglied
Hallo!

1) Ich verstehe nicht ganz, wie man einen String aufteilen kann mit .split.
zB:
Code:
String s = "Hallo hallo | HALLO";
Wie "teile" ich den String s auf?
Also zB dass alles vor dem |-Zeichen in String s1 gespeichert wird, und alles nach dem |-Zeichen in String s2 gespeichert wird.

2) Wie kann man alle Zeilen einer Textdatei löschen, in denen ein bestimmter Inhalt vorkommt?
Ich weiß leider nur, wie ich den bestimmten Inhalt aus allen Zeilen entferne, aber nicht die ganze Zeile, in der der bestimmte Inhalt vorkommt.

MfG
Lanzettlich!
 

Volvagia

Top Contributor
Du bekommst bei split() ja schon ein Array mit n Strings zurück.

2) Lesen, ändern, neue Datei schreiben. Die Zeilen werden ja durch \n(\r) getrennt.
 

Lanzettlich

Mitglied
Hallo!

Und wie wandle ich dann den Array in 2 "selbstständige" Strings um?
Also: String s1 = "Hallo"; String s2= "HALLO";
Vielleicht mit einer for-Schleife und einem StringBuilder?

Meine Idee funktioniert leider nicht so ganz:
"SplittArray[0] + SplittArray[1] + SplittArray[2] + SplittArray[3]"
Die Ausgabe ist dann: Hal

MfG
Lanzettlich
 

Lanzettlich

Mitglied
Hallo!
Ich habe jetzt mal das ausprobiert:
Java:
		String text = "Hallo | HALLO";
		String[] SplittArray = text.split("|");
		for(String s : SplittArray)
		{
			System.out.println(s);
		}
Allerdings bekomme ich da als Ausgabe:
H
a
l
l
o

|

H
A
L
L
O

Wie bekomme ich denn jetzt das "Hallo" (was vor | steht) in String s1 und "HALLO" (was nach | steht) in String s2?
 

ssoul26

Bekanntes Mitglied
Hallo!
Ich habe jetzt mal das ausprobiert:
Java:
		String text = "Hallo | HALLO";
		String[] SplittArray = text.split("|");
		for(String s : SplittArray)
		{
			System.out.println(s);
		}
Allerdings bekomme ich da als Ausgabe:
H
a
l
l
o

|

H
A
L
L
O

Wie bekomme ich denn jetzt das "Hallo" (was vor | steht) in String s1 und "HALLO" (was nach | steht) in String s2?

Achte auf die "\\". Was das konrket bedeutet, kannst du ja googlen;)

Java:
  String text = "Hallo | HALLO";
      String[] SplittArray = text.split("\\|");
      for(String s : SplittArray)
      {
          System.out.println(s);
      }
 

Lanzettlich

Mitglied
Danke, darauf bin ich auch selbst draufgekommen ;P

Und zu meiner 2. Frage:
Wie löscht man alle Zeilen einer Textdatei mit einem bestimmten Inhalt?
Also nicht nur den bestimmten Inhalt aus allen Zeilen, sondern gleich alle Zeilen mit diesem Inhalt löschen.

MfG
Lanzettlich!
 

Volvagia

Top Contributor
Du gehst mit einer Schleife durch, prüfst ob die Zeile einen bestimmten Inhalt hast und entfernst sie. Zeilen sind durch (char)13 oder durch (char)13(char)10 getrennt. (Das sind zumindest die Standart-Zeilenumbrüche von Linux und Windows, wie es sich mit Mac oder anderen OSen verhält weiß ich nicht.)

Kannst ja einfach mit nen BufferedReader zeilenweiße lesen, und wenn sie die Needle nicht enthalten fügst du sie zu einen StringBuilder hinzu und schreibst ihn wieder in einen runter in eine Datei.

Ich bevorzuge [|] statt \\|, das läuft aber auf das selbe raus. Bei den einen wird es als Zeichen und nicht als Regex interpretiert, bei den anderen nicht als Regex. (Also als Zeichen. ^^)
 

Lanzettlich

Mitglied
Wie überprüfe ich denn, ob eine Zeile einen bestimmten Inhalt enthält?

Mein aktueller Code:
Java:
                BufferedReader in = new BufferedReader(new FileReader(file));
	        String str;
	        while ((str = in.readLine()) != null)
	        {
	        	
	        	String str1 = str;
	        	List<String> list = new ArrayList<String>();
	        	list.add(str1);
	        	for(String s : list)
	        	{

	        	}
	        }
 

Volvagia

Top Contributor
Warum legst du bei jedem neuen Schleifendurchgang eine neue Liste an, fügst etwas hinzu und willst dann darüber iterieren?
String enthält die Methode contains. Wenn du nichts extra brauchst (z. B. Case-Insensitive Suche) kannst du diese verwenden um festzustellen, ob der String eine genaue Zeichenfolge enthält.
 
T

Trolllllll

Gast
So!?!
Java:
            BufferedReader in = new BufferedReader(new FileReader(file));
            String str;
            String newString;
            while ((str = in.readLine()) != null)
            {
                if (str.contains("wenn das enthalten dann nicht)){
                   //do nothing
                }else{
                    newString=newString+str+"\n\r";
                }
            }
            // nun den neuen String (newString) in deine Datei schreiben
 

Volvagia

Top Contributor
Noch nicht ganz. Es fehlt ein Anführungszeichen (deshalb wird der restliche Code blau) und durch das Zusammenfügen der Strings wird am Anfang immer null stehen (da du damit den String intialisieren musst, das kannst du aber mit newString = ""; umgehen).
Außerdem wird am Ende immer eine Leerzeile hinzugefügt, ich denke das ist aber das unwichtigste daran.

Du solltest zum Zusammensetzen des Strings einen StringBuilder nehmen, Strings sollte man niemals in einer Schleife zusammensetzen.
Und du solltest die Intialisierung von in und das Erzeugen des Readers in 2 Zeilen verteilen, sonst kann du es nicht mehr im finally-Block der zur try/catch gehört schließen.
 
H

hüteüberhüte

Gast
Zu 2): So auf die schnelle:
Java:
    public static String removeLines(String str, String regex) throws IOException {
        Pattern pattern = Pattern.compile(regex);
        StringWriter stringWriter = new StringWriter(str.length());
        PrintWriter printWriter = new PrintWriter(stringWriter);
        BufferedReader reader = new BufferedReader(new StringReader(str));
        String line;
        while ((line = reader.readLine()) != null) {
            if (!pattern.matcher(line).find()) {
                printWriter.println(line);
            }
        }
        return stringWriter.toString();
    }

    public static void main(String[] args) throws IOException {
        System.out.print(removeLines("hallo\n"
                                   + "Hallo\n"
                                   + "hAllo\n"
                                   + "haLlo\n"
                                   + "halLo\n"
                                   + "hallO", "ha(Ll)|(lL)o"));
    }

Müsstest nur noch was zum einlesen einer Datei schreiben. (Haut mich nicht, wenn man das so nicht machen würde ;) )
 
T

Trolllllll

Gast
So jetzt sollten die Bugs drausen sein und es ist ziemlich so wie es der TO gemacht hat und nicht ein komplett anderer code, obwohl deiner hüteüberhüte schick aussieht, so auf den ersten blick, im gegensatz zu meinem
Java:
            BufferedReader in = new BufferedReader(new FileReader(file));
            String str;
            String newString="";
            boolean first=true;
            while ((str = in.readLine()) != null)
            {
                if (str.contains("wenn das enthalten dann nicht")){
                   //do nothing
                }else{
                    if(first){
                        newString=newString+str
                    }else{
                       newString=newString+"\n\r"+str;
                    }
                }
            }
            // nun den neuen String (newString) in deine Datei schreiben
 

mla.rue

Bekanntes Mitglied
Java:
            BufferedReader in = new BufferedReader(new FileReader(file));
            String str;
            String newString="";
            boolean first=true;
            while ((str = in.readLine()) != null)
            {
                if (!str.contains("wenn das enthalten dann nicht")){
                    if(first){
                        newString=newString+str;
                        first = false; //was willst damit eigentlich? das Problem ist die letzte Zeile, nicht die erste
                    }else{
                       newString=newString+"\n\r"+str;
                    }
                }
            }
            // nun den neuen String (newString) in deine Datei schreiben
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
@Trolllllll: Mein Problem, warum ich so viele Klassen verwendet habe, war, das ich String-Konkatenation und
Code:
System.getProperty("line.separator");
umgehen wollte, und eine Systemunabhängige Lösung zu basteln
 

Volvagia

Top Contributor

Strings sind nach der Intitalisierung nicht mehr veränderbar (immutable).
Deshalb werden bei Schleifen viele String erzeugt.
Um das zu vermeiden verwendet man einen StringBuilder. An den heftet man jeden Schleifendurchgang den nächsten String an und holt sich nach der Schleife den endgültigen String per toString.

Java:
public static void main(String[] args) {
	useNoBuilder();
	//useBuilder();
}
private static void useNoBuilder() {
	String s = "";
	for(int i = 0; i < Short.MAX_VALUE * 2; i++) {
		s+= i;
	}
	System.out.println(s);
	System.out.println("Done (noBuilder)");
}
private static void useBuilder() {
	StringBuilder builder = new StringBuilder();
	for(int i = 0; i < Short.MAX_VALUE * 2; i++) {
		builder.append(String.valueOf(i));
	}
	System.out.println(builder.toString());
	System.out.println("Done (Builder)");
}

useBuilder() ist um ein vielfaches schneller als useNoBuilder().
 
T

Trolllllll

Gast
first = false; //was willst damit eigentlich? das Problem ist die letzte Zeile, nicht die erste
Stimmt, die Zeile habe ich vergessen ;-)
Mhh kommt drauf an, wenn du dir den Code durchließt, siehst du warum die erste Zeile ;-)
Die erste Zeile hat keinen Zeilenumbruch, und der wird jetzt vor jeder Zeile eingefügt und nicht dannach, außer halt bei der ersten Zeile
 
F

Firephoenix

Gast
@Trolllllll: Mein Problem, warum ich so viele Klassen verwendet habe, war, das ich String-Konkatenation und
Code:
System.getProperty("line.separator");
umgehen wollte, und eine Systemunabhängige Lösung zu basteln

Wenn du einen Printwriter erzeugst wird intern ebenfalls das Property line.separator abgefragt und bei allen Methoden verwendet die eine neue Zeile schreiben (z.B. println()).

Ich hab mal einen kleinen Grundriss für das Filtern geschrieben den man beliebig erweitern kann (Filterstrategien einbauen statt dem contains, alte Datei behalten, Fehlerbehandlung falls temporäre Datei existiert, etc...)
Vorteil von der Methode ist, dass du nie die komplett Datei im Speicher halten kannst und so auch eine Datei filtern kannst die mehrere Gigabyte groß ist.

Java:
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class FileFilter {

	public static void main(String[] args){
		FileFilter f = new FileFilter();
		f.filter("test.txt");
	}
	
	public void filter(String filename){
		File original_file = new File(filename);
		File temp_file = new File(filename+".tmp");
		BufferedReader in = null;
		PrintWriter out = null;
		try {
			in = new BufferedReader(new FileReader(original_file));
			out = new PrintWriter(new FileWriter(temp_file));
			String line = null;
			while((line = in.readLine())!=null){
				if(!matchFilter(line)){
					out.println(line);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			closeClosable(in);
			closeClosable(out);
		}
		if(original_file.delete()){
			temp_file.renameTo(new File(filename));
		}

	}
	private boolean matchFilter(String line) {
		return line.contains("blub");
	}
	private void closeClosable(Closeable c){
		if(c != null){
			try {
				c.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

test.txt vorher
Code:
12398124

blub
afdsadf
asdfjlkasdblubasfdsdfa
ssadfkljkasdjf

981743214

blub lbuasdf

fsadfe  blub

bß0989787^1c2


sadfsdaf


...

test.txt nachher:
Code:
12398124

afdsadf
ssadfkljkasdjf

981743214



bß0989787^1c2


sadfsdaf


...

Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Java Split mehrere Zeilen Java Basics - Anfänger-Themen 4
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
OnDemand Regex oder Split? Java Basics - Anfänger-Themen 5
I String.split regex Frage Java Basics - Anfänger-Themen 2
JavaClara Fehlermeldung bei split-Methode Java Basics - Anfänger-Themen 12
S String split Java Basics - Anfänger-Themen 12
Dimax String Split Java Basics - Anfänger-Themen 2
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
9 Error bei .split() Java Basics - Anfänger-Themen 2
S Methoden String: split Java Basics - Anfänger-Themen 5
T split innerhalb Klammern ignorieren? Java Basics - Anfänger-Themen 6
MR._FIRE_Flower String.split("(") geht nicht Java Basics - Anfänger-Themen 4
D Input/Output Split am Zeichen | Java Basics - Anfänger-Themen 2
W split()-Methode Java Basics - Anfänger-Themen 4
C Gleichung String Split Java Basics - Anfänger-Themen 6
agent47 Pattern split Java Basics - Anfänger-Themen 2
D BufferedReader/InputStreamReader/Split Java Basics - Anfänger-Themen 2
G String.split(".") Java Basics - Anfänger-Themen 3
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
R Split ab bestimmter Stelle Java Basics - Anfänger-Themen 9
A String Split Java Basics - Anfänger-Themen 4
K Split und ArrayList Java Basics - Anfänger-Themen 3
JAVAnnik split Methode Java Basics - Anfänger-Themen 1
K How to split my String Java Basics - Anfänger-Themen 2
L String array mit split füllen Java Basics - Anfänger-Themen 14
N split nullpoiner exception Java Basics - Anfänger-Themen 6
P CSV Datei in String Array -> Split -> New Array Java Basics - Anfänger-Themen 2
vandread String.split("\\") führt zu Error?! Java Basics - Anfänger-Themen 8
N Explode in Java (split). Komme nicht weiter. Java Basics - Anfänger-Themen 2
B Split, Exception - Obwohl es gehen MUSS Java Basics - Anfänger-Themen 3
S Probleme mit split Java Basics - Anfänger-Themen 5
N Probleme mit .split("\\.") Java Basics - Anfänger-Themen 6
N String [][] mit .split Java Basics - Anfänger-Themen 13
Helgon Regex Split Java Basics - Anfänger-Themen 2
B Array fehler bei string split Java Basics - Anfänger-Themen 4
L Methoden String.split nach Absätzen? Java Basics - Anfänger-Themen 8
S Split String für | Java Basics - Anfänger-Themen 2
K split() - Delimiter Java Basics - Anfänger-Themen 4
F Split Array auffüllen Java Basics - Anfänger-Themen 8
S Hexstring contains & split Java Basics - Anfänger-Themen 2
R String Delimiter (Split) einlesen Java Basics - Anfänger-Themen 9
R .split() - Problem Java Basics - Anfänger-Themen 5
0 String split und replace geht nicht Java Basics - Anfänger-Themen 17
T Syntax für .split mit Klammern Java Basics - Anfänger-Themen 2
T String Split? Java Basics - Anfänger-Themen 10
F String Split Problem mit "|" Java Basics - Anfänger-Themen 3
D String.split(...) Java Basics - Anfänger-Themen 4
Z split tut nicht, was es soll Java Basics - Anfänger-Themen 3
C Split Fehler? Java Basics - Anfänger-Themen 7
D BufferedWriter, split() und Zeilenumbrüche Java Basics - Anfänger-Themen 5
D BufferedReader und .split() Java Basics - Anfänger-Themen 3
Y split()-Methoden problem Java Basics - Anfänger-Themen 21
J String split-Funktion und Integer Java Basics - Anfänger-Themen 13
X nach split leerzeichen weg Java Basics - Anfänger-Themen 4
M Regex mit Split Java Basics - Anfänger-Themen 3
S String - Gegenteil von Split? Java Basics - Anfänger-Themen 2
L Java: split und trim Java Basics - Anfänger-Themen 6
D String.split(".") geht nicht? Java Basics - Anfänger-Themen 3
M split arbeitet nicht richtig Java Basics - Anfänger-Themen 2
D Split Java Basics - Anfänger-Themen 11
Eldorado Fehler bei String.split Java Basics - Anfänger-Themen 4
S String Split ohne Zeichen abzuschneiden Java Basics - Anfänger-Themen 7
MQue split()- Methode Java Basics - Anfänger-Themen 10
B Split() Funktion Java Basics - Anfänger-Themen 5
M String splitten mit split() Java Basics - Anfänger-Themen 4
T .split(";") nicht gleich große arrays werden erzeu Java Basics - Anfänger-Themen 2
S String split array.length Problem Java Basics - Anfänger-Themen 3
B String ordentlich trennen (regex, split())? Java Basics - Anfänger-Themen 11
J Problem mit Split und String Java Basics - Anfänger-Themen 3
G Probleme mit Split Java Basics - Anfänger-Themen 5
M String.split() und StringTokenizer Java Basics - Anfänger-Themen 2
ARadauer String.split -> unterschiedliche längen Java Basics - Anfänger-Themen 2
H Split läuft nicht wie ich will Java Basics - Anfänger-Themen 4
I <String>.split()? Java Basics - Anfänger-Themen 2
I String, Split, match, wo liegt mein Fehler ? Java Basics - Anfänger-Themen 4
S Worthäufigkeiten zählen nach String.split() Java Basics - Anfänger-Themen 5
F String split-Methode Java Basics - Anfänger-Themen 12
M split() mit anzahl zeichen Java Basics - Anfänger-Themen 2
R split ist komisch Java Basics - Anfänger-Themen 2
G Bei split die regex erhalten Java Basics - Anfänger-Themen 6
P Probleme mit split Java Basics - Anfänger-Themen 4
Q String split bei "" Java Basics - Anfänger-Themen 4
G Problem mit String.split(""); Java Basics - Anfänger-Themen 2
M Problem Dateiarbeit: split und trim Java Basics - Anfänger-Themen 4
C Collection in Verbindung mit String.split speicherlastig Java Basics - Anfänger-Themen 20
C String.split("") einzelne Positionen abfragen Java Basics - Anfänger-Themen 10
D String mit split teilen und leere Felder behalten Java Basics - Anfänger-Themen 4
O String mit split zerlegen Java Basics - Anfänger-Themen 6
G Split Operation: ein oder mehrere Leerzeichen Java Basics - Anfänger-Themen 7
E Was ist bei split() los? Java Basics - Anfänger-Themen 2
F Split und Satzzeichen Java Basics - Anfänger-Themen 2
M Split nur mit einem Kriterium? Java Basics - Anfänger-Themen 4
G Split String Java Basics - Anfänger-Themen 2
G BufferedReader - split-Methode Java Basics - Anfänger-Themen 6
G Habe bei String kein split()? Java Basics - Anfänger-Themen 7
B try & catch Problem mit Exception bzw String.split() Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben