web-dev-qa-db-fra.com

Comment supprimer les sauts de ligne d'un fichier en Java?

Comment puis-je remplacer tous les sauts de ligne d'une chaîne dans Java de manière à fonctionner sous Windows et Linux (c'est-à-dire sans problèmes de système de retour chariot/saut de ligne/nouvelle ligne, etc.)?

J'ai essayé (note readFileAsString est une fonction qui lit un fichier texte dans une chaîne):

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

mais cela ne semble pas fonctionner.

Comment cela peut-il être fait?

237
tree-hacker

Vous devez définir text sur les résultats de text.replace():

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

Cela est nécessaire car les chaînes sont immuables - appeler replace ne modifie pas la chaîne d'origine, elle en renvoie une nouvelle qui a été modifiée. Si vous n'attribuez pas le résultat à text, cette nouvelle chaîne est perdue et récupérée.

Pour obtenir la chaîne newline pour n’importe quel environnement, elle est disponible en appelant System.getProperty("line.separator").

395
Kaleb Brasee

Comme indiqué dans d'autres réponses, votre code ne fonctionne pas principalement parce que String.replace(...) ne modifie pas la cible String. (Cela ne peut pas - Java les chaînes sont immuables!) En réalité, replace crée et renvoie un nouvel objet String avec les caractères modifiés en fonction des besoins. Mais votre code jette alors cette String ...


Voici quelques solutions possibles. Lequel est le plus correct dépend de ce que vous essayez exactement de faire.

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

Supprime simplement tous les caractères de nouvelle ligne. Cela ne convient pas aux fins de ligne Windows ou Mac.

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

Supprime toutes les terminaisons de ligne pour la plate-forme actuelle. Cela ne convient pas au cas où vous essayez de traiter (par exemple) un fichier UNIX sous Windows ou inversement.

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

Supprime tous les terminateurs de ligne Windows, UNIX ou Mac. Cependant, si le fichier d'entrée est du texte, cela concaténera des mots; par exemple.

Goodbye cruel
world.

devient

Goodbye cruelworld.

Donc, vous voudrez peut-être faire ceci:

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

qui remplace chaque terminateur de ligne par un espace. Depuis Java 8, vous pouvez également le faire:

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

Et si vous souhaitez remplacer plusieurs séparateurs de lignes par un seul espace:

// #6
text = text.replaceAll("\\R+", " ");
201
Stephen C

Si vous souhaitez supprimer uniquement les terminaisons de ligne valides sur le système d'exploitation actuel, procédez comme suit:

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

Si vous voulez vous assurer que vous supprimez les séparateurs de lignes, vous pouvez le faire comme ceci:

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

Ou un peu plus verbeux, mais moins regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
20
Fabian Steeg

Cette fonction normalise tous les espaces, y compris les sauts de ligne, en espaces simples. Pas exactement ce que la question initiale demandait, mais susceptible de faire exactement ce qui est nécessaire dans de nombreux cas:

import org.Apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
11
David McWhorter
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

A fonctionné parfaitement pour moi après avoir recherché beaucoup, après avoir échoué avec toutes les autres lignes.

10
Renán D

Ce serait efficace je suppose

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

édité pour mettre en évidence la syntaxe

9
JSBach

Les sauts de ligne ne sont pas les mêmes sous windows/linux/mac. Vous devez utiliser System.getProperties avec l'attribut line.separator.

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

Même si la définition de trim () sur le site Web Oracle est "Renvoie une copie de la chaîne, les espaces de début et de fin étant omis".

la documentation omet d'indiquer que les caractères de nouvelle ligne (début et fin) seront également supprimés.

En bref, String text = readFileAsString("textfile.txt").trim(); fonctionnera également pour vous. (Vérifié avec Java 6)

3
MukeshKoshyM

Vous voudrez peut-être lire votre fichier avec un BufferedReader. Cette classe peut diviser les entrées en lignes individuelles que vous pouvez assembler à votre guise. La façon dont fonctionne BufferedReader reconnaît automatiquement les conventions de fin de ligne des mondes Linux, Windows et MacOS, quelle que soit la plate-forme actuelle.

Par conséquent:

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

Notez que readLine() n'inclut pas le terminateur de ligne dans la chaîne renvoyée. Le code ci-dessus ajoute un espace pour éviter de coller le dernier mot d'une ligne et le premier mot de la ligne suivante.

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

.replace renvoie une nouvelle chaîne, les chaînes dans Java sont immuables.

3
Viktor Klang

Je trouve cela étrange que (Apache) StringUtils n'ait pas encore été traité ici.

vous pouvez supprimer toutes les nouvelles lignes (ou toute autre occurrence d'une sous-chaîne) d'une chaîne à l'aide de la méthode .replace

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

Cette ligne remplacera toutes les nouvelles lignes par la chaîne vide.

parce que newline est techniquement un caractère, vous pouvez éventuellement utiliser la méthode .replaceChars qui remplacera les caractères

StringUtils.replaceChars(myString, '\n', '');
1
svarog

Vous pouvez utiliser Apache Ions utilitaire pour parcourir la ligne et ajouter chaque ligne à StringBuilder. Et n'oubliez pas de fermer le 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
Shravan Ramamurthy

Vous pouvez utiliser des méthodes génériques pour remplacer un caractère par un autre.

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

}
0
Rakesh Chaudhari

FYI si vous pouvez vouloir remplacer les sauts de ligne multiples simultanés par un saut de ligne unique, vous pouvez utiliser

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

Ou remplacer par un seul espace

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