Як видалити розриви рядків з файлу на Java?


258

Як я можу замінити всі розриви рядків у рядку на Java таким чином, що буде працювати в Windows та Linux (тобто немає специфічних для ОС проблем з поверненням каретки / подачею рядків / новою лінією тощо)?

Я спробував (зверніть увагу readFileAsString - це функція, яка читає текстовий файл у String):

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

але це, здається, не працює.

Як це можна зробити?


Ви хочете усунути всі розриви рядків? Або ви хочете уніфікувати їх до стандартного рішення?
геліос

4
О, якщо ви хочете видалити всі канали рядків, видаліть усі \ n І всі \ r (тому що зламок рядків Windows - \ r \ n).
геліос

Гей, FYI, якщо ви хочете замінити одночасні перерви в режимі безперервної дії з однорядковим розривом, тоді ви можете використовувати 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, то ця нова струна втрачається і сміття збирається.

Що стосується отримання рядка для рядків для будь-якого середовища - про це можна отримати, зателефонувавши 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", "");
basZero

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?) У вас буде рішення з лише одним пробілом для кожної послідовності нових рядків.
Jørn Schou-Rode

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" під час вставки. Тому що це має працювати. Можливо, це тому, що я забув останній крапку з комою (;) наприкінці.
JSBach

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

Я багато працював для мене після того, як багато шукав, не вдався з будь-яким іншим рядком.



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)


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

FYI, якщо ви можете замінити одночасні перерви в режимі muti-line однорядковим розривом, тоді ви можете використовувати

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

}


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

5
якщо ви заміняєте \nбільше \r\nнемає, якщо ви замінюєте \ n і є \\ n, він буде замінений, тому залишиться лише \
Роб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.