2010-01-29 125 views
187

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

He tratado (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?

+0

¿Desea eliminar todos los saltos de línea? ¿O desea uniformizarlos a una solución estándar? – helios

+4

Ah, si desea eliminar todos los avances de línea, elimine \ nY todos \ r (porque el salto de línea de Windows es \ r \ n). – helios

+0

Oiga, para su información, si puede reemplazar los muti-linebreaks simultáneos con un salto de línea, puede usar 'myString.trim(). ReplaceAll (" [\ n] {2,} "," \ n ")' O reemplace con un espacio simple 'myString.trim(). ReplaceAll (" [\ n] {2,} "," ")' –

Respuesta

317

Es necesario configurar text a los resultados de text.replace():

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

Esto es necesario porque las cadenas son inmutables - pidiendo replace no cambia la cadena original, devuelve uno nuevo que ha cambiado. Si no asigna el resultado al text, esa nueva Cadena se pierde y se recolecta la basura.

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

+1

+1, correcto. En cuanto a la razón: la cadena es ** inmutable **. El método 'replace()' ** devuelve ** el resultado deseado. Consulte también los documentos de la API: http://java.sun.com/javase/6/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java.lang.CharSequence%29 * Edit. : * ah ya lo editó usted mismo después :) – BalusC

+55

Quizás 'text = text.replace (" \ r \ n "," ") .replace (" \ n "," ");' es una solución mejor: de lo contrario las palabras se "pegarán" entre sí (sin el reemplazo de espacio único). –

+0

Sí, eso es posible. Todo depende del tipo de datos que intentes modificar. A veces (para datos tales como cuadernos COBOL) no quiere que haya espacios entre las líneas. –

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

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

6

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

18

Si desea eliminar sólo las terminaciones de línea que son válidos en el sistema operativo actual, usted puede hacer esto:

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

Si desea asegurarse de quitar todos los separadores de línea, puede hacerlo de esta manera :

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

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

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

Para evitar pegar palabras juntas (como se comenta en los comentarios de la respuesta de Kaleb) el enfoque de expresiones regulares podría modificarse para 'text.replaceAll (" (\\ r | \\ n) + "," ")' y (suponiendo que greedy es el valor predeterminado en Java?) tendrá una solución con solo * un * espacio para cada secuencia de nuevos caracteres de línea . –

180

Como se señala en ot sus respuestas, su código no está funcionando principalmente porque String.replace(...) no cambia la cadena de destino. (No puede - ¡las cadenas de Java son inmutables!) Lo que realmente hace es crear una nueva Cadena con los caracteres modificados según sea necesario. Sin embargo, su código a continuación, se deshace de esa cadena ...


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

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

Simplemente elimina todos los caracteres de nueva línea. Esto no es compatible con las terminaciones de línea de Windows o Mac.

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

Elimina todos los finales de línea para la plataforma actual. Esto no es compatible con el 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. 

convierte

Goodbye cruelworld. 

Así que en realidad podría querer hacer esto:

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

que sustituye a cada final de línea con un espacio.

+2

La tercera opción es la mejor dado que el origen de un archivo de texto puede ser independiente. – trillions

+0

Usando el enfoque "System.getProperty (" line.seperator ")" sería lo mejor para ser tan independiente del sistema como sea posible. ¡Gran respuesta, gracias! – Kingsolmn

+2

@Kingsolmn - en realidad depende de lo que quieras decir por agnóstico. ¿Qué sucede si necesita ser agnóstico del sistema que creó el archivo? es decir, si no puede suponer que fue creado en "este" sistema? –

2

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 forma en que opera BufferedReader reconoce automáticamente las convenciones de terminación de línea de los mundos Linux, Windows y MacOS, 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.

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

A pesar de que la definición de trim() en el sitio web de Oracle es "Devuelve una copia de la cadena, con el espacio inicial y final omite."

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

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

-2

trate de 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", ""); 
+5

si reemplaza '\ n' no hay' \ r \ n' más si reemplaza \ n y hay un \\ n será reemplazado por lo que solo \ permanecerá. – Rob

5

Esto sería eficiente supongo

String s; 
s = "try this\n try me."; 
s.replaceAll("[\\r\\n]+", "") 

editado por resaltado de sintaxis

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

Funcionaba perfectamente para mí después de buscar mucho, ha ving falló con cualquier otra línea.

0

Puede usar apache commons IOUtils para recorrer la línea y anexar cada línea a StringBuilder. Y no se olvide de cerrar la 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); 
0

Me parece extraño que (Apache) StringUtils no estaba cubierto aquí todavía.

puede eliminar todos los saltos de línea (o cualquier otro ocurrencias de una subcadena para el caso) de una cadena utilizando el método .replace

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

Esta línea sustituirá a todos los saltos de línea con la cadena vacía.

debido nueva línea es técnicamente un personaje puede utilizar opcionalmente el método .replaceChars que reemplazará los caracteres

StringUtils.replaceChars(myString, '\n', ''); 
+0

'StringUtils.replaceEachRepeatedly (myString, new String [] {" \ n "," \ t "}, new String [] {StringUtils.Empty, StringUtils.Empty});' –

0

FYI si puede que desee reemplazar simultáneas muti-saltos de línea con rotura de puente de una sola línea, puede utilizar

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

O reemplazar con un solo espacio

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

Puede utilizar métodos genéricos para reemplazar cualquier char con cualquier char.

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++; 
    } 

} 
3

This function normaliza por todos los espacios, incluyendo saltos de línea, a los 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); 
Cuestiones relacionadas