Comment faire pour supprimer les sauts de ligne à partir d'un fichier en Java?
Comment puis-je le remplacer tous les sauts de ligne à partir d'une chaîne de caractères en Java dans une telle manière qui fonctionne sur Windows et Linux (c'est à dire pas OS des problèmes spécifiques de retour chariot/saut de ligne/ligne nouvelle, etc.)?
J'ai essayé (note readFileAsString est une fonction qui lit un fichier texte dans une Chaîne de caractères):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
mais cela ne semble pas fonctionner.
Comment cela peut-il être fait?
- Vous voulez éliminer tous les sauts de ligne? Ou vous souhaitez uniformiser à une solution standard?
- Oh, si vous souhaitez supprimer tous les sauts de ligne, supprimer tous les \n ET tous les \r (car Windows saut de ligne est \r\n).
- Hey, pour info si vous voulez remplacer simultanée muti-retours à la ligne (avec un seul saut de ligne, alors vous pouvez utiliser
myString.trim().replaceAll("[\n]{2,}", "\n")
Ou remplacez-les par un espace uniquemyString.trim().replaceAll("[\n]{2,}", " ")
Vous devez vous connecter pour publier un commentaire.
Vous devez définir
text
aux résultats detext.replace()
:Cela est nécessaire parce que les Chaînes sont immuables-appel
replace
ne pas changer de Chaîne, elle renvoie un nouveau qui a été modifié. Si vous n'affectez pas le résultat detext
, alors que la nouvelle Chaîne est perdu et les ordures collectées.Comme pour obtenir le retour à la ligne de Chaîne à n'importe quel environnement -- qui est disponible en appelant
System.getProperty("line.separator")
.replace()
méthode renvoie le résultat souhaité. Voir aussi l'API docs: java.sun.com/javase/6/docs/api/java/lang/... Edit: ah vous avez déjà édité que vous-même dans la suite 🙂text = text.replace("\r\n", " ").replace("\n", " ");
est une meilleure solution: autrement mots seront "collés" les uns aux autres (sans le seul espace de remplacement)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replace
prend dans les chaînes littérales, à la fois de remplacer toutes les occurences.Comme indiqué dans d'autres réponses, votre code ne fonctionne pas principalement parce que
String.replace(...)
ne modifie pas la Chaîne cible. (Il ne peut pas - Java, les chaînes sont immuables!) Ce qu'il fait n'est crée une nouvelle Chaîne avec les caractères modifiés. Mais votre code puis jette cette Chaîne ...Voici quelques solutions possibles. Celui qui est le plus correct dépend exactement ce que vous essayez de faire.
Simplement supprime tous les caractères de saut de ligne. Ce n'est pas faire face avec Windows ou Mac les fins de ligne.
Supprime tous les terminateurs de ligne pour la plate-forme actuelle. Ce n'est pas de gérer le cas où vous essayez de processus (par exemple) un fichier UNIX sur Windows, ou vice versa.
Supprime tous les Windows, UNIX ou Mac ligne terminateurs. Toutefois, si le fichier d'entrée est du texte, ce concaténer des mots; par exemple,
devient
De sorte que vous pourriez réellement envie de le faire:
qui remplace chaque terminaison de ligne avec un espace. Depuis Java 8, vous pouvez également le faire:
Et si vous souhaitez remplacer plusieurs séparateurs de ligne avec un espace:
Si vous souhaitez supprimer la ligne des terminaisons qui sont valables sur le système d'exploitation actuel, vous pourriez faire ceci:
Si vous voulez assurez-vous de supprimer tous les séparateurs de ligne, vous pouvez le faire comme ceci:
Ou, un peu plus verbeux, mais moins regexy:
text.replaceAll("(\\r|\\n)+", " ")
et (en supposant que gourmand est par défaut en Java?) vous aurez une solution avec juste un de l'espace pour chaque séquence de la nouvelle ligne de caractères.Cette fonction normalise vers le bas tous les espaces, y compris les sauts de ligne, à des espaces simples. Pas exactement ce que l'original question posée, mais susceptibles de faire exactement ce qui est nécessaire dans de nombreux cas:
A parfaitement fonctionné pour moi, après la recherche d'un lot, après avoir échoué avec chaque autre ligne.
Ce serait efficace je suppose que
édité pour la surbrillance de la syntaxe
Mais les sauts de ligne ne sont pas de la même sous windows/linux/mac. Vous devez utiliser Système.getProperties avec l'attribut de la ligne.séparateur.
.remplacer renvoie une nouvelle chaîne de caractères, chaînes de caractères en Java sont Immuables.
Vous voudrez peut-être lire votre fichier avec un
BufferedReader
. Cette classe peut casser d'entrée en lignes individuelles, que vous pouvez assembler à volonté. La façonBufferedReader
fonctionne reconnaît de fin de ligne conventions de l'Linux, Windows et MacOS mondes automatiquement, indépendamment de la plate-forme actuelle.Donc:
Noter que
readLine()
ne comprend pas le terminateur de ligne dans la chaîne renvoyée. Le code ci-dessus ajoute un espace pour éviter de coller ensemble le dernier mot d'une ligne et le premier mot de la ligne suivante.Même si la définition de trim() dans oracle site web est
"Retourne une copie de la chaîne, avec attaque et de fuite des espaces omis."
la documentation omet de dire que les caractères de nouvelle ligne (avant et arrière) seront également supprimées.
En bref
String text = readFileAsString("textfile.txt").trim();
aussi le travail pour vous.(Vérifié avec Java 6)
Je trouve bizarre que (Apache) StringUtils n'était pas couvert ici encore.
vous pouvez supprimer tous les retours à la ligne (ou toutes les autres occurrences d'une sous-chaîne que ce soit), à partir d'une chaîne à l'aide de la
.replace
méthodeCette ligne permettra de remplacer tous les retours à la ligne avec la chaîne vide.
parce que le saut de ligne est techniquement un personnage que vous pouvez éventuellement utiliser l'
.replaceChars
méthode de remplacement de caractèresStringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Pour info si vous voulez remplacer simultanée muti-retours à la ligne (avec un seul saut de ligne, alors vous pouvez utiliser
Ou remplacez-les par un espace unique
Vous pouvez utiliser apache commons IOUtils pour parcourir la ligne et ajouter à chaque ligne de StringBuilder. Et ne pas oublier de fermer la InputStream
Vous pouvez utiliser des méthodes génériques pour remplacer tout char avec n'importe quel char.
org.apache.commons.lang.StringUtils#chopNewline
Essayez de faire cela:
\n
il n'y a pas de\r\n
plus si vous remplacez \n et il y a un \\n, elle sera remplacée pour seulement l' \ restera.