275 votes

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

Comment puis-je remplacer tous les sauts de ligne d'une chaîne de caractères en Java d'une manière qui fonctionnera sous Windows et Linux (c'est-à-dire sans les problèmes spécifiques aux systèmes d'exploitation de retour de chariot/saut de ligne/nouvelle ligne, etc.)

J'ai essayé (notez que 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 ?

0 votes

Voulez-vous éliminer tous les sauts de ligne ? Ou vous voulez les uniformiser selon une solution standard ?

4 votes

Oh, si vous voulez supprimer tous les sauts de ligne, supprimez tous les \n ET tout \r (parce que le saut de ligne de Windows est \r\n ).

0 votes

Si vous souhaitez remplacer les sauts de ligne simultanés par des sauts de ligne uniques, vous pouvez utiliser la méthode suivante myString.trim().replaceAll("[\n]{2,}", "\n") Ou remplacer par un simple espace myString.trim().replaceAll("[\n]{2,}", " ")

473voto

Kaleb Brasee Points 25776

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

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

C'est nécessaire parce que les chaînes de caractères sont immuables. replace ne modifie pas la chaîne originale, elle renvoie une nouvelle chaîne qui a été modifiée. Si vous n'assignez pas le résultat à text alors cette nouvelle chaîne est perdue et mise au rebut.

Quant à l'obtention de la chaîne de caractères de nouvelle ligne pour n'importe quel environnement -- cela est disponible en appelant System.getProperty("line.separator") .

1 votes

+1, correct. Quant à la raison : String est immuable . Le site replace() méthode renvoie à le résultat souhaité. Voir aussi les documents de l'API : java.sun.com/javase/6/docs/api/java/lang/ Edit : ah vous l'avez déjà édité vous-même par la suite :)

82 votes

Peut-être text = text.replace("\r\n", " ").replace("\n", " "); est une meilleure solution : sinon les mots seront "collés" les uns aux autres (sans le remplacement par un seul espace).

0 votes

Oui, c'est possible. Tout dépend du type de données que vous essayez de modifier. Parfois (pour des données telles que les cahiers COBOL), vous ne voulez pas qu'il y ait d'espace entre les lignes.

241voto

Stephen C Points 255558

Comme indiqué dans d'autres réponses, votre code ne fonctionne pas. principalement parce que String.replace(...) ne change pas la chaîne cible. (Il ne peut pas - les chaînes Java sont immuables !) Ce qu'il fait en fait, c'est créer une nouvelle chaîne avec les caractères modifiés comme requis. Mais votre code jette ensuite cette chaîne ...


Voici quelques solutions possibles. La solution la plus appropriée dépend de ce que vous essayez de faire exactement.

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

Supprime simplement tous les caractères de nouvelle ligne. Cela ne prend pas en compte les terminaisons de ligne de Windows ou de Mac.

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

Supprime tous les terminateurs de ligne pour la plate-forme actuelle. Cela ne permet pas de faire face au cas où vous essayez de traiter (par exemple) un fichier UNIX sous Windows, ou vice versa.

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

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

Goodbye cruel
world.

devient

Goodbye cruelworld.

Donc tu pourrais vouloir faire ça :

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

qui remplace chaque terminaison de ligne par un espace.

3 votes

C'est une EXCELLENTE réponse. Bravo pour les exemples en Java 8. Merci pour votre aide !

0 votes

Merci, cela a fonctionné pour moi... au fait, pouvez-vous expliquer pourquoi text = text.replaceAll(" \\r\\n | \\r | \\n ", " ") ;

23voto

Fabian Steeg Points 24261

Si vous souhaitez supprimer uniquement les terminaisons de ligne valides sur le système d'exploitation actuel, vous pouvez procéder ainsi :

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

Si vous voulez vous assurer que vous supprimez tous les séparateurs de ligne, vous pouvez procéder comme suit :

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

Ou, un peu plus verbeux, mais moins regexy :

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

2 votes

Pour éviter de coller les mots ensemble (comme discuté dans les commentaires de la réponse de Kaleb), l'approche regex pourrait être modifiée de la manière suivante text.replaceAll("(\\r|\\n)+", " ") et (en supposant que l'avarice est par défaut en Java ?) vous aurez une solution avec seulement un espace pour chaque séquence de nouveaux caractères de ligne.

13voto

Renán D Points 11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Cela a fonctionné parfaitement pour moi après avoir cherché beaucoup, ayant échoué avec toutes les autres lignes.

0 votes

J'essayais de le faire individuellement, je ne savais pas pourquoi ça ne marchait pas, celui-ci fonctionne comme un charme.

6voto

Aif Points 4603

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X