Bagaimana cara menghapus jeda baris dari file di Jawa?


258

Bagaimana saya bisa mengganti semua jeda baris dari string di Jawa sedemikian rupa yang akan bekerja pada Windows dan Linux (yaitu tidak ada masalah khusus OS dari carriage return / line feed / baris baru dll.)?

Saya sudah mencoba (note readFileAsString adalah fungsi yang membaca file teks menjadi sebuah String):

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

tapi ini sepertinya tidak berhasil.

Bagaimana ini bisa dilakukan?


Apakah Anda ingin menghilangkan semua jeda baris? Atau Anda ingin menyeragamkannya ke solusi standar?
helios

4
Oh, jika Anda ingin menghapus semua umpan baris, hapus semua \ n DAN semua \ r (karena Windows linebreak adalah \ r \ n).
helios

Hai, FYI jika Anda ingin mengganti muti-linebreak secara simultan dengan single line break maka Anda dapat menggunakan myString.trim().replaceAll("[\n]{2,}", "\n") atau mengganti dengan satu ruang myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Jawaban:


435

Anda perlu mengatur texthasil text.replace():

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

Ini diperlukan karena String tidak dapat diubah - panggilan replacetidak mengubah String asli, tetapi mengembalikan String baru yang telah diubah. Jika Anda tidak menetapkan hasilnya text, maka String baru itu hilang dan sampah dikumpulkan.

Adapun untuk mendapatkan String baris baru untuk lingkungan apa pun - yang tersedia dengan menelepon System.getProperty("line.separator").


1
+1, benar. Adapun alasannya: String tidak dapat diubah . The replace()Metode mengembalikan hasil yang diinginkan. Juga lihat dokumen API: java.sun.com/javase/6/docs/api/java/lang/... Sunting: ah Anda sudah mengeditnya sendiri setelahnya :)
BalusC

75
Mungkin text = text.replace("\r\n", " ").replace("\n", " ");merupakan solusi yang lebih baik: jika tidak kata-kata akan "direkatkan" satu sama lain (tanpa penggantian satu ruang).
Bart Kiers

9
Anda juga bisa menggunakan tanda kurung siku untuk mencocokkan baris baru dengan benar untuk OS apa pun:.replaceAll("[\\r\\n]+", "")
Yeti

2
Karena pertanyaannya adalah meminta untuk mengganti SEMUA kejadian, solusinya agaktext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@ basZero replaceAllmengambil regex, replacemengambil string literal, keduanya menggantikan semua kejadian.
Joonas Vali

220

Seperti disebutkan dalam jawaban lain, kode Anda tidak berfungsi terutama karena String.replace(...)tidak mengubah target String. (Tidak bisa - string Java tidak dapat diubah!) Yang replacesebenarnya dilakukan adalah membuat dan mengembalikan Stringobjek baru dengan karakter yang diubah sesuai kebutuhan. Tetapi kode Anda kemudian membuang itu String...


Berikut adalah beberapa solusi yang mungkin. Yang mana yang paling benar tergantung pada apa yang sebenarnya Anda coba lakukan.

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

Cukup hapus semua karakter baris baru. Ini tidak mengatasi pemutusan jalur Windows atau Mac.

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

Menghapus semua terminator saluran untuk platform saat ini. Ini tidak mengatasi kasus di mana Anda mencoba memproses (misalnya) file UNIX di Windows, atau sebaliknya.

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

Menghapus semua terminator jalur Windows, UNIX atau Mac. Namun, jika file input adalah teks, ini akan menyatukan kata-kata; misalnya

Goodbye cruel
world.

menjadi

Goodbye cruelworld.

Jadi, Anda mungkin benar-benar ingin melakukan ini:

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

yang menggantikan setiap terminator garis dengan spasi. Karena Java 8 Anda juga dapat melakukan ini:

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

Dan jika Anda ingin mengganti beberapa pemisah garis dengan satu spasi:

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

1
Ini adalah jawaban yang SANGAT BAIK. Kudos untuk Java 8 contoh. Terima kasih atas bantuannya!
HankNessip

22

Jika Anda ingin menghapus hanya terminator garis yang valid pada OS saat ini, Anda bisa melakukan ini:

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

Jika Anda ingin memastikan Anda menghapus pemisah garis apa pun, Anda dapat melakukannya seperti ini:

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

Atau, sedikit lebih bertele-tele, tetapi kurang regexy:

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

2
Untuk menghindari perekatan kata (seperti yang dibahas dalam komentar atas jawaban Kaleb) pendekatan regex dapat dimodifikasi untuk text.replaceAll("(\\r|\\n)+", " ")dan (dengan asumsi serakah adalah default di Jawa?) Anda akan memiliki solusi dengan hanya satu ruang untuk setiap urutan barisan baris baru.
Jørn Schou-Rode

19

Fungsi ini menormalkan ke bawah semua spasi putih, termasuk jeda baris, ke ruang tunggal. Tidak persis apa yang ditanyakan oleh pertanyaan awal, tetapi cenderung melakukan apa yang dibutuhkan dalam banyak kasus:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

14

Kurasa ini akan efisien

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

Pastikan Anda memiliki kode yang sama persis, daripada kehilangan karakter "\ n" saat menempel. Karena itu harus bekerja. Mungkin itu karena saya lupa titik koma (;) terakhir di akhir.
JSBach

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

Bekerja dengan sempurna untuk saya setelah mencari banyak, setelah gagal dengan setiap baris lainnya.



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

.replace mengembalikan string baru, string di Java tidak dapat diubah.


3

Anda mungkin ingin membaca file Anda dengan BufferedReader. Kelas ini dapat memecah input menjadi garis-garis individual, yang dapat Anda rakit sesuka hati. JalanBufferedReader operasinya mengenali konvensi garis akhir dari dunia Linux, Windows dan MacOS secara otomatis, terlepas dari platform saat ini.

Karenanya:

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();

Perhatikan bahwa readLine()tidak termasuk terminator garis dalam string yang dikembalikan. Kode di atas menambahkan spasi untuk menghindari perekatan kata terakhir dari sebuah baris dan kata pertama dari baris berikutnya.


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

Meskipun definisi trim () di situs web oracle adalah "Mengembalikan salinan string, dengan spasi spasi awalan dan jejak dihapus."

dokumentasi tidak menyebutkan bahwa karakter baris baru (depan dan belakang) juga akan dihapus.

Singkatnya String text = readFileAsString("textfile.txt").trim();juga akan bekerja untuk Anda. (Diperiksa dengan Java 6)


1

Saya merasa aneh bahwa (Apache) StringUtils belum dibahas di sini.

Anda dapat menghapus semua baris baru (atau kejadian lain dari substring dalam hal ini) dari string menggunakan .replacemetode ini

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

Baris ini akan mengganti semua baris baru dengan string kosong.

karena baris baru secara teknis adalah karakter, Anda dapat menggunakan .replaceCharsmetode yang akan menggantikan karakter secara opsional

StringUtils.replaceChars(myString, '\n', '');

StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford

0

FYI jika Anda ingin mengganti muti-linebreak secara simultan dengan single line break maka Anda dapat menggunakannya

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

Atau ganti dengan satu ruang

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

0

Anda dapat menggunakan apache commons IOUtils untuk beralih melalui baris dan menambahkan setiap baris ke StringBuilder. Dan jangan lupa untuk menutup 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

Anda dapat menggunakan metode umum untuk mengganti arang apa pun dengan arang apa pun.

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

Coba lakukan ini:

 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
jika Anda mengganti \ntidak ada \r\nlagi jika Anda mengganti \ n dan ada \\ n itu akan diganti sehingga hanya \ akan tetap.
Rob
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.