Wie entferne ich Zeilenumbrüche aus einer Datei in Java?

258

Wie kann ich alle Zeilenumbrüche aus einer Zeichenfolge in Java so ersetzen, dass sie unter Windows und Linux funktionieren (dh keine betriebssystemspezifischen Probleme mit Wagenrücklauf / Zeilenvorschub / neue Zeile usw.)?

Ich habe es versucht (Anmerkung readFileAsString ist eine Funktion, die eine Textdatei in einen String liest):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

aber das scheint nicht zu funktionieren.

Wie kann das gemacht werden?

Baumhacker
quelle
Möchten Sie alle Zeilenumbrüche beseitigen? Oder möchten Sie sie zu einer Standardlösung vereinheitlichen?
Helios
4
Oh, wenn Sie alle Zeilenvorschübe löschen möchten, entfernen Sie alle \ n UND alle \ r (da Windows-Zeilenumbruch \ r \ n ist).
Helios
Hey, FYI, wenn Sie simultane Muti-Linebreaks durch einen einzelnen Zeilenumbruch ersetzen möchten, können Sie verwenden myString.trim().replaceAll("[\n]{2,}", "\n") oder durch ein einzelnes Leerzeichen ersetzen myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Antworten:

435

Sie müssen folgende textErgebnisse erzielen text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

Dies ist erforderlich, da Strings unveränderlich sind. Durch Aufrufen replacewird der ursprüngliche String nicht geändert, sondern es wird ein neuer zurückgegeben, der geändert wurde. Wenn Sie das Ergebnis nicht zuweisen text, geht dieser neue String verloren und der Müll wird gesammelt.

Der Newline-String für jede Umgebung wird abgerufen, indem Sie ihn aufrufen System.getProperty("line.separator").

Kaleb Brasee
quelle
1
+1, richtig. Zum Grund: String ist unveränderlich . Die replace()Methode gibt das gewünschte Ergebnis zurück. Siehe auch die API-Dokumente: java.sun.com/javase/6/docs/api/java/lang/… Bearbeiten: Ah, Sie haben das bereits selbst später bearbeitet :)
BalusC
75
Vielleicht text = text.replace("\r\n", " ").replace("\n", " ");ist eine bessere Lösung: Andernfalls werden Wörter aneinander "geklebt" (ohne den Einzelraumersatz).
Bart Kiers
9
Sie können auch eckige Klammern verwenden, um Zeilenumbrüche für jedes Betriebssystem richtig abzugleichen:.replaceAll("[\\r\\n]+", "")
Yeti
2
Da die Frage nach dem Ersetzen ALLER Vorkommen fragt, ist die Lösung ehertext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero
2
@basZero replaceAllnimmt Regex auf, replacenimmt Literalzeichenfolgen auf , beide ersetzen alle Vorkommen.
Joonas Vali
220

Wie in anderen Antworten erwähnt, funktioniert Ihr Code in erster Linie nicht, da String.replace(...)das Ziel nicht geändert wird String. (Es kann nicht - Java-Zeichenfolgen sind unveränderlich!) Tatsächlich replacewird ein neues StringObjekt erstellt und zurückgegeben, wobei die Zeichen nach Bedarf geändert werden. Aber Ihr Code wirft dann das weg String...


Hier sind einige mögliche Lösungen. Welches am besten ist, hängt davon ab, was genau Sie versuchen.

// #1
text = text.replace("\n", "");

Entfernt einfach alle Zeilenumbruchzeichen. Dies ist nicht mit Windows- oder Mac-Leitungsbeendigungen möglich.

// #2
text = text.replace(System.getProperty("line.separator"), "");

Entfernt alle Leitungsterminatoren für die aktuelle Plattform. Dies ist nicht der Fall, wenn Sie versuchen, beispielsweise eine UNIX-Datei unter Windows zu verarbeiten, oder umgekehrt.

// #3
text = text.replaceAll("\\r|\\n", "");

Entfernt alle Windows-, UNIX- oder Mac-Zeilenabschlüsse. Wenn es sich bei der Eingabedatei jedoch um Text handelt, werden Wörter verkettet. z.B

Goodbye cruel
world.

wird

Goodbye cruelworld.

Vielleicht möchten Sie dies tatsächlich tun:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

Dies ersetzt jeden Zeilenabschluss durch ein Leerzeichen. Seit Java 8 können Sie dies auch tun:

// #5
text = text.replaceAll("\\R", " ");

Und wenn Sie mehrere Zeilentrennzeichen durch ein Leerzeichen ersetzen möchten:

// #6
text = text.replaceAll("\\R+", " ");
Stephen C.
quelle
1
Dies ist eine ausgezeichnete Antwort. Ein großes Lob für die Java 8-Beispiele. Danke für die Hilfe!
HankNessip
22

Wenn Sie nur Zeilenabschlüsse entfernen möchten, die auf dem aktuellen Betriebssystem gültig sind, können Sie Folgendes tun:

text = text.replaceAll(System.getProperty("line.separator"), "");

Wenn Sie sicherstellen möchten, dass alle Zeilentrennzeichen entfernt werden, können Sie dies folgendermaßen tun:

text = text.replaceAll("\\r|\\n", "");

Oder etwas ausführlicher, aber weniger regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Fabian Steeg
quelle
2
Um ein Zusammenkleben von Wörtern zu vermeiden (wie in den Kommentaren zu Kalebs Antwort erläutert), könnte der Regex-Ansatz geändert werden, text.replaceAll("(\\r|\\n)+", " ")und (vorausgesetzt, Gier ist in Java Standard?) Sie haben eine Lösung mit nur einem Leerzeichen für jede Folge neuer Zeilenzeichen.
Jørn Schou-Rode
19

Diese Funktion normalisiert alle Leerzeichen, einschließlich Zeilenumbrüche, auf einzelne Leerzeichen. Nicht genau das, wonach die ursprüngliche Frage gestellt hat, aber wahrscheinlich genau das, was in vielen Fällen benötigt wird:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
David McWhorter
quelle
14

Das wäre effizient, denke ich

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
JSBach
quelle
Stellen Sie sicher, dass Sie genau den gleichen Code haben, anstatt die "\ n" Zeichen beim Einfügen zu verlieren. Weil es funktionieren sollte. Vielleicht liegt es daran, dass ich am Ende das letzte Semikolon (;) vergessen habe.
JSBach
11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Funktionierte perfekt für mich, nachdem ich viel gesucht hatte, nachdem ich mit jeder anderen Zeile versagt hatte.

Renán D.
quelle
6

Zeilenumbrüche sind unter Windows / Linux / Mac nicht identisch. Sie sollten System.getProperties mit dem Attribut line.separator verwenden.

Aif
quelle
3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace gibt eine neue Zeichenfolge zurück. Zeichenfolgen in Java sind unveränderlich.

Viktor Klang
quelle
3

Möglicherweise möchten Sie Ihre Datei mit einem lesen BufferedReader. Diese Klasse kann Eingaben in einzelne Zeilen aufteilen, die Sie nach Belieben zusammenstellen können. Die Funktionsweise BufferedReadererkennt Zeilenendkonventionen der Linux-, Windows- und MacOS-Welt automatisch, unabhängig von der aktuellen Plattform.

Daher:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

Beachten Sie, dass der readLine()Zeilenabschluss nicht in der zurückgegebenen Zeichenfolge enthalten ist. Der obige Code fügt ein Leerzeichen hinzu, um zu vermeiden, dass das letzte Wort einer Zeile und das erste Wort der nächsten Zeile zusammengeklebt werden.

Thomas Pornin
quelle
3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Obwohl die Definition von trim () in der Oracle-Website "Gibt eine Kopie der Zeichenfolge zurück, wobei führende und nachfolgende Leerzeichen weggelassen werden".

In der Dokumentation wird nicht angegeben, dass auch neue Zeilenzeichen (führende und nachfolgende) entfernt werden.

Kurz gesagt, String text = readFileAsString("textfile.txt").trim();wird auch für Sie arbeiten. (Mit Java 6 überprüft)

MukeshKoshyM
quelle
1

Ich finde es seltsam, dass (Apache) StringUtils hier noch nicht behandelt wurde.

Mit der .replaceMethode können Sie alle Zeilenumbrüche (oder andere Vorkommen eines Teilstrings) aus einer Zeichenfolge entfernen

StringUtils.replace(myString, "\n", "");

Diese Zeile ersetzt alle Zeilenumbrüche durch die leere Zeichenfolge.

Da newline technisch gesehen ein Zeichen ist, können Sie optional die .replaceCharsMethode verwenden, die Zeichen ersetzt

StringUtils.replaceChars(myString, '\n', '');
svarog
quelle
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford
0

Zu Ihrer Information, wenn Sie gleichzeitige Mehrzeilenbrüche durch einen einzelnen Zeilenumbruch ersetzen möchten, können Sie verwenden

myString.trim().replaceAll("[\n]{2,}", "\n")

Oder durch ein einzelnes Leerzeichen ersetzen

myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra
quelle
0

Sie können Apache Commons IOUtils verwenden, um die Zeile zu durchlaufen und jede Zeile an StringBuilder anzuhängen. Und vergessen Sie nicht, den InputStream zu schließen

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);
Shravan Ramamurthy
quelle
0

Sie können generische Methoden verwenden, um jedes Zeichen durch ein beliebiges Zeichen zu ersetzen.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}
Rakesh Chaudhari
quelle
-1

org.apache.commons.lang.StringUtils # chopNewline

Kumar Abhishek
quelle
2
-1, weil veraltet und nur am Ende der Zeichenfolge entfernt wird.
João Farias
-2

Versuchen Sie Folgendes:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");
Seyf
quelle
5
Wenn Sie ersetzen, \ngibt es keine \r\nmehr, wenn Sie \ n ersetzen, und es gibt ein \\ n, das ersetzt wird, sodass nur das \ übrig bleibt.
Rob