Как удалить разрывы строк из файла в Java?
Как я могу заменить все разрывы строк из строки в Java таким образом, чтобы это работало в Windows и Linux (т. Е. Не было проблем, связанных с возвратом каретки / переводом строки / новой строкой и т. Д.)?
Я пробовал (обратите внимание, readFileAsString - это функция, которая читает текстовый файл в строку):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
но это не похоже на работу.
Как это может быть сделано?
17 ответов
Вам нужно установить text
к результатам text.replace()
:
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Это необходимо, потому что строки неизменны - вызов replace
не изменяет исходную строку, она возвращает новую, которая была изменена. Если вы не назначаете результат text
, то эта новая строка теряется и мусор собирается.
Что касается получения строки новой строки для любой среды - это можно получить, позвонив System.getProperty("line.separator")
,
Как отмечено в других ответах, ваш код не работает в первую очередь потому, что String.replace(...)
не меняет целевую строку. (Это невозможно - строки Java являются неизменяемыми!) На самом деле создается новая строка с символами, измененными по мере необходимости. Но ваш код затем выбрасывает эту строку...
Вот несколько возможных решений. Какой из них наиболее правильный, зависит от того, что именно вы пытаетесь сделать.
// #1
text = text.replace("\n", "");
Просто удаляет все символы новой строки. Это не справляется с завершением строки Windows или Mac.
// #2
text = text.replace(System.getProperty("line.separator"), "");
Удаляет все ограничители строки для текущей платформы. Это не относится к случаю, когда вы пытаетесь обработать (например) файл UNIX в Windows или наоборот.
// #3
text = text.replaceAll("\\r|\\n", "");
Удаляет все разделители строк в Windows, UNIX или Mac. Однако, если входной файл является текстом, это объединит слова; например
Goodbye cruel
world.
становится
Goodbye cruelworld.
Таким образом, вы можете захотеть сделать это:
// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");
который заменяет каждый разделитель строки пробелом.
Эта функция нормализует все пробелы, включая разрывы строк, до одиночных пробелов. Не совсем то, о чем просил первоначальный вопрос, но, скорее всего, во многих случаях он будет делать именно то, что нужно:
import org.apache.commons.lang3.StringUtils;
final String cleansedString = StringUtils.normalizeSpace(rawString);
Если вы хотите удалить только ограничители строки, которые действительны в текущей ОС, вы можете сделать это:
text = text.replaceAll(System.getProperty("line.separator"), "");
Если вы хотите убедиться, что удалили разделители строк, вы можете сделать это следующим образом:
text = text.replaceAll("\\r|\\n", "");
Или, немного более многословный, но менее регулярный:
text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Я думаю, это будет эффективно
String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
отредактировано для подсветки синтаксиса
str = str.replaceAll("\\r\\n|\\r|\\n", " ");
Сработал отлично для меня после долгих поисков, потерпев неудачу с любой другой строкой.
Разрывы строк не совпадают в Windows/ Linux/ Mac. Вы должны использовать System.getProperties с атрибутом line.separator.
В Котлине, а также с Java 11,
String
имеет
lines()
, который возвращает список строк в многострочной строке. Вы можете получить все строки, а затем объединить их в одну строку.
С Kotlin это будет так же просто, как
str.lines().joinToString("")
String text = readFileAsString("textfile.txt").replaceAll("\n", "");
Хотя определение trim() на веб-сайте oracle гласит: "Возвращает копию строки, пропуская начальные и конечные пробелы".
в документации не сказано, что символы новой строки (начальные и конечные) также будут удалены.
КорочеString text = readFileAsString("textfile.txt").trim();
также будет работать на вас.
(Проверено с Java 6)
Вы можете прочитать ваш файл с BufferedReader
, Этот класс может разбивать ввод на отдельные строки, которые вы можете собрать по желанию. Путь BufferedReader
Оператор распознает соглашения об окончании строк в мире Linux, Windows и MacOS автоматически, независимо от текущей платформы.
Следовательно:
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();
Обратите внимание, что readLine()
не включает терминатор строки в возвращаемой строке. Приведенный выше код добавляет пробел, чтобы избежать склеивания последнего слова строки и первого слова следующей строки.
String text = readFileAsString("textfile.txt").replace("\n","");
.replace возвращает новую строку, строки в Java неизменны.
Я нахожу странным, что (Apache) StringUtils здесь еще не освещался.
Вы можете удалить все новые строки (или любые другие вхождения подстроки по этому вопросу) из строки, используя .replace
метод
StringUtils.replace(myString, "\n", "");
Эта строка заменит все новые строки пустой строкой.
потому что перевод строки является технически символом, который вы можете использовать .replaceChars
метод, который заменит символы
StringUtils.replaceChars(myString, '\n', '');
К вашему сведению, если вы хотите заменить одновременные разрывы строк на один раз, тогда вы можете использовать
myString.trim().replaceAll("[\n]{2,}", "\n")
Или заменить на один пробел
myString.trim().replaceAll("[\n]{2,}", " ")
Вы можете использовать apache commons IOUtils для перебора строки и добавления каждой строки в StringBuilder. И не забудьте закрыть 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);
Вы можете использовать универсальные методы для замены любого символа любым другим.
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++;
}
}
Попробуйте сделать это:
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", "");