¿Cómo eliminar saltos de línea de un archivo en Java?

258

¿Cómo puedo reemplazar todos los saltos de línea de una cadena en Java de tal manera que funcione en Windows y Linux (es decir, sin problemas específicos del sistema operativo de retorno de carro / avance de línea / nueva línea, etc.)?

Lo he intentado (nota readFileAsString es una función que lee un archivo de texto en una Cadena):

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

Pero esto no parece funcionar.

¿Cómo se puede hacer esto?

hacker
fuente
¿Quieres eliminar todos los saltos de línea? ¿O desea uniformarlos a una solución estándar?
helios
44
Ah, si desea eliminar todos los avances de línea, elimine todos \ n Y todos \ r (porque el salto de línea de Windows es \ r \ n).
helios
Oye, para tu información, si deseas reemplazar los saltos de línea simultáneos con un salto de línea simple, entonces puedes usar myString.trim().replaceAll("[\n]{2,}", "\n") O reemplazar con un solo espacio myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Respuestas:

435

Debe establecer textlos resultados de text.replace():

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

Esto es necesario porque las cadenas son inmutables: las llamadas replaceno cambian la cadena original, devuelve una nueva que se ha cambiado. Si no asigna el resultado text, entonces esa nueva Cadena se pierde y se recolecta basura.

En cuanto a obtener la cadena de nueva línea para cualquier entorno, que está disponible llamando System.getProperty("line.separator").

Kaleb Brasee
fuente
1
+1, correcto. En cuanto a la razón: la cadena es inmutable . El replace()método devuelve el resultado deseado. También vea los documentos de la API: java.sun.com/javase/6/docs/api/java/lang/… Editar: ah ya lo editó usted mismo después :)
BalusC
75
Quizás text = text.replace("\r\n", " ").replace("\n", " ");sea ​​una mejor solución: de lo contrario, las palabras se "pegarán" entre sí (sin el reemplazo de un solo espacio).
Bart Kiers el
9
También puede usar corchetes para unir correctamente las nuevas líneas para cualquier sistema operativo:.replaceAll("[\\r\\n]+", "")
Yeti
2
Como la pregunta es reemplazar TODAS las ocurrencias, la solución es más bientext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero
2
@basZero replaceAlltoma expresiones regulares, replacetoma cadenas literales, ambas reemplazan todas las ocurrencias.
Joonas Vali
220

Como se señaló en otras respuestas, su código no funciona principalmente porque String.replace(...)no cambia el objetivo String. (No puede, ¡las cadenas de Java son inmutables!) Lo que replacerealmente hace es crear y devolver un nuevo Stringobjeto con los caracteres cambiados según sea necesario. Pero tu código arroja eso String...


Aquí hay algunas posibles soluciones. Cuál es el más correcto depende de qué es exactamente lo que está tratando de hacer.

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

Simplemente elimina todos los caracteres de nueva línea. Esto no hace frente a las terminaciones de línea de Windows o Mac.

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

Elimina todos los terminadores de línea para la plataforma actual. Esto no hace frente al caso en el que intenta procesar (por ejemplo) un archivo UNIX en Windows, o viceversa.

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

Elimina todos los terminadores de línea de Windows, UNIX o Mac. Sin embargo, si el archivo de entrada es texto, esto concatenará palabras; p.ej

Goodbye cruel
world.

se convierte

Goodbye cruelworld.

Por lo tanto, es posible que desee hacer esto:

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

que reemplaza cada terminador de línea con un espacio. Desde Java 8 también puedes hacer esto:

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

Y si desea reemplazar varios separadores de línea con un espacio:

// #6
text = text.replaceAll("\\R+", " ");
Stephen C
fuente
1
Esta es una EXCELENTE respuesta. Felicitaciones por los ejemplos de Java 8. ¡Gracias por la ayuda!
HankNessip
22

Si desea eliminar solo los terminadores de línea que son válidos en el sistema operativo actual, puede hacer esto:

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

Si desea asegurarse de eliminar los separadores de línea, puede hacerlo así:

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

O, un poco más detallado, pero menos regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Fabian Steeg
fuente
2
Para evitar pegar palabras juntas (como se discutió en los comentarios a la respuesta de Kaleb), el enfoque de expresiones regulares podría modificarse text.replaceAll("(\\r|\\n)+", " ")y (¿suponiendo que codicioso es el predeterminado en Java?) Tendrá una solución con solo un espacio para cada secuencia de nuevos caracteres de línea.
Jørn Schou-Rode
19

Esta función normaliza todos los espacios en blanco, incluidos los saltos de línea, a espacios individuales. No es exactamente lo que pidió la pregunta original, pero es probable que haga exactamente lo que se necesita en muchos casos:

import org.apache.commons.lang3.StringUtils;

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

Supongo que esto sería eficiente

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
JSBach
fuente
Asegúrese de tener exactamente el mismo código, en lugar de perder los caracteres "\ n" al pegar. Porque debería funcionar. Tal vez sea porque olvidé el último punto y coma (;) al final.
JSBach
11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Funcionó perfectamente para mí después de buscar mucho, habiendo fallado con cada otra línea.

Renán D
fuente
6

Los saltos de línea no son iguales en windows / linux / mac. Debe usar System.getProperties con el atributo line.separator.

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

.replace devuelve una nueva cadena, las cadenas en Java son inmutables.

Viktor Klang
fuente
3

Es posible que desee leer su archivo con un BufferedReader. Esta clase puede dividir la entrada en líneas individuales, que puede ensamblar a voluntad. La maneraBufferedReader funciona reconoce las convenciones de final de línea de los mundos de Linux, Windows y MacOS automáticamente, independientemente de la plataforma actual.

Por lo tanto:

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();

Tenga en cuenta que readLine()no incluye el terminador de línea en la cadena devuelta. El código anterior agrega un espacio para evitar pegar la última palabra de una línea y la primera palabra de la línea siguiente.

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

Aunque la definición de trim () en el sitio web de Oracle es "Devuelve una copia de la cadena, con espacios en blanco iniciales y finales omitidos".

la documentación omite decir que los nuevos caracteres de línea (al principio y al final) también se eliminarán.

En resumen String text = readFileAsString("textfile.txt").trim();, también funcionará para usted. (Comprobado con Java 6)

MukeshKoshyM
fuente
1

Me resulta extraño que (Apache) StringUtils no esté cubierto aquí todavía.

puede eliminar todas las líneas nuevas (o cualquier otra ocurrencia de una subcadena para ese asunto) de una cadena usando el .replacemétodo

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

Esta línea reemplazará todas las líneas nuevas con la cadena vacía.

como newline es técnicamente un carácter, opcionalmente puede usar el .replaceCharsmétodo que reemplazará a los caracteres

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

Para su información, si desea reemplazar los saltos de línea simultáneos simultáneos con un solo salto de línea, puede usar

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

O reemplazar con un solo espacio

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

Puede usar apache commons IOUtils para recorrer en iteración la línea y agregar cada línea a StringBuilder. Y no olvides cerrar InputStream

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
fuente
0

Puede usar métodos genéricos para reemplazar cualquier carácter con cualquier carácter.

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
fuente
-1

org.apache.commons.lang.StringUtils # chopNewline

Kumar Abhishek
fuente
2
-1 porque está en desuso y solo se elimina al final de la cadena.
João Farias
-2

Intenta hacer esto:

 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
fuente
55
si reemplaza \nya no existe \r\nsi reemplaza \ n y hay un \\ n, se reemplazará, por lo que solo quedará el \.
Rob el