Как удалить разрывы строк из файла в Java?

258

Как я могу заменить все разрывы строк из строки в Java таким образом, чтобы это работало в Windows и Linux (т. Е. Без проблем, связанных с возвратом каретки / переводом строки / новой строкой и т. Д.)?

Я пробовал (обратите внимание, readFileAsString - это функция, которая читает текстовый файл в строку):

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

но это не похоже на работу.

Как это может быть сделано?

дерево-хакер
источник
Вы хотите устранить все разрывы строк? Или вы хотите унифицировать их до стандартного решения?
Гелиос
4
О, если вы хотите удалить все переводы строк, удалите все \ n И все \ r (потому что перевод строки Windows равен \ r \ n).
Гелиос
Эй, к вашему сведению, если вы хотите заменить одновременные разрывы строк с одним разрывом строки, то вы можете использовать myString.trim().replaceAll("[\n]{2,}", "\n") или заменить один пробел myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Ответы:

435

Вам необходимо установить textрезультаты text.replace():

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

Это необходимо, потому что строки неизменны - вызов replaceне изменяет исходную строку, а возвращает новую, которая была изменена. Если вы не присваиваете результат text, тогда эта новая строка теряется и мусор собирается.

Что касается получения новой строки String для любой среды - это доступно по телефону System.getProperty("line.separator").

Калеб Бразе
источник
1
+1, правильно. Что касается причины: строка неизменна . replace()Метод возвращает желаемый результат. Также смотрите документацию по API: java.sun.com/javase/6/docs/api/java/lang/… Редактировать: ах вы уже редактировали это потом :)
BalusC
75
Возможно text = text.replace("\r\n", " ").replace("\n", " ");, это лучшее решение: в противном случае слова будут «склеены» друг с другом (без замены одного пробела).
Барт Киерс
9
Вы также можете использовать квадратные скобки для правильного соответствия символов новой строки для любой ОС:.replaceAll("[\\r\\n]+", "")
Yeti
2
Поскольку вопрос text = text.replaceAll("\n", "").replaceAll("\r", "");
требует
2
@basZero replaceAllпринимает регулярные выражения, replaceпринимает буквальные строки, оба заменяют все вхождения.
Joonas Vali
220

Как отмечено в других ответах, ваш код не работает в первую очередь потому, String.replace(...)что не меняет цель String. (Это невозможно - строки Java являются неизменяемыми!) Что на replaceсамом деле делает, так это создает и возвращает новый Stringобъект с измененными символами по мере необходимости. Но ваш код затем выбрасывает это String...


Вот несколько возможных решений. Какой из них наиболее правильный, зависит от того, что именно вы пытаетесь сделать.

// #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", " ");

который заменяет каждый терминатор строки пробелом. Начиная с Java 8 вы также можете сделать это:

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

И если вы хотите заменить несколько разделителей строк одним пробелом:

// #6
text = text.replaceAll("\\R+", " ");
Стивен С
источник
1
Это ОТЛИЧНЫЙ ответ. Слава для Java 8 примеров. Спасибо вам за помощь!
HankNessip
22

Если вы хотите удалить только ограничители строки, которые действительны в текущей ОС, вы можете сделать это:

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

Если вы хотите убедиться, что удалили разделители строк, вы можете сделать это следующим образом:

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

Или, немного более многословный, но менее регулярный:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Фабиан Стиг
источник
2
Чтобы избежать склеивания слов (как обсуждалось в комментариях к ответу Калеба), подход к регулярным выражениям можно было бы изменить, text.replaceAll("(\\r|\\n)+", " ")и (предполагая, что в Java по умолчанию используется жадность?), У вас будет решение с одним пробелом для каждой последовательности новых строковых символов.
Йорн Шоу-Роде
19

Эта функция нормализует все пробелы, включая разрывы строк, до одиночных пробелов. Не совсем то, о чем просил первоначальный вопрос, но, скорее всего, во многих случаях он будет делать именно то, что нужно:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
Дэвид МакВортер
источник
14

Я думаю, это будет эффективно

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
И.С.Бах
источник
Убедитесь, что у вас точно такой же код, а не теряйте символы "\ n" при вставке. Потому что это должно работать. Возможно, это потому, что я забыл последнюю точку с запятой (;) в конце.
И.С.Бах
11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Сработал отлично для меня после долгих поисков, потерпев неудачу с любой другой строкой.

Ренан Д
источник
6

Разрывы строк не совпадают в Windows / Linux / Mac. Вы должны использовать System.getProperties с атрибутом line.separator.

Aif
источник
3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace возвращает новую строку, строки в Java неизменны.

Виктор Кланг
источник
3

Вы можете прочитать ваш файл с помощью 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()в возвращаемую строку не входит терминатор строки. Код выше добавляет пробел, чтобы избежать склеивания последнего слова строки и первого слова следующей строки.

Томас Порнин
источник
3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Хотя определение trim () на веб-сайте oracle гласит: «Возвращает копию строки, пропуская начальные и конечные пробелы».

в документации не сказано, что символы новой строки (начальные и конечные) также будут удалены.

Короче и у String text = readFileAsString("textfile.txt").trim();тебя тоже будет работать. (Проверено с Java 6)

MukeshKoshyM
источник
1

Я нахожу странным, что (Apache) StringUtils здесь еще не освещался.

Вы можете удалить все новые строки (или любые другие вхождения подстроки по этому вопросу) из строки, используя .replaceметод

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

Эта строка заменит все новые строки пустой строкой.

потому что символ новой строки технически является символом, вы можете использовать .replaceCharsметод, который заменит символы

StringUtils.replaceChars(myString, '\n', '');
Сварог
источник
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Лукас Кроуфорд
0

К вашему сведению, если вы хотите заменить одновременные разрывы строк на один раз, тогда вы можете использовать

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

Или заменить на один пробел

myString.trim().replaceAll("[\n]{2,}", " ")
Сурав Чандра
источник
0

Вы можете использовать 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);
Шраван Рамамурти
источник
0

Вы можете использовать универсальные методы для замены любого символа любым другим.

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

}
Ракеш Чаудхари
источник
-1

org.apache.commons.lang.StringUtils # chopNewline

Кумар Абхишек
источник
2
-1, потому что устарел и удаляет только в конце строки.
Жоао Фариас
-2

Попробуйте сделать это:

 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", "");
Seyf
источник
5
если вы замените, \nто больше \r\nне будет, если вы замените \ n, и есть \\ n, он будет заменен, поэтому останется только \.
Роб