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?

peretas pohon
sumber
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").

Kaleb Brasee
sumber
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+", " ");
Stephen C
sumber
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", "");
Fabian Steeg
sumber
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);
David McWhorter
sumber
14

Kurasa ini akan efisien

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
JSBach
sumber
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.

Renán D
sumber
6

Linebreak tidak sama di bawah windows / linux / mac. Anda harus menggunakan System.getProperties dengan atribut line.separator.

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

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

Viktor Klang
sumber
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.

Thomas Pornin
sumber
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)

MukeshKoshyM
sumber
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', '');
svarog
sumber
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,}", " ")
Sourav Chandra
sumber
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);
Shravan Ramamurthy
sumber
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++;
    }

}
Rakesh Chaudhari
sumber
-1

org.apache.commons.lang.StringUtils # chopNewline

Kumar Abhishek
sumber
2
-1 karena sudah usang dan hanya menghilangkan di akhir string.
João Farias
-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", "");
seyf
sumber
5
jika Anda mengganti \ntidak ada \r\nlagi jika Anda mengganti \ n dan ada \\ n itu akan diganti sehingga hanya \ akan tetap.
Rob