วิธีการลบตัวแบ่งบรรทัดจากไฟล์ใน Java?


258

ฉันจะแทนที่ตัวแบ่งบรรทัดทั้งหมดจากสตริงใน Java ในลักษณะที่จะทำงานบน Windows และ Linux ได้ (เช่นไม่มีปัญหาเฉพาะระบบปฏิบัติการของการขึ้นบรรทัดใหม่ / การป้อนบรรทัด / การขึ้นบรรทัดใหม่ ฯลฯ )?

ฉันได้ลองแล้ว (note readFileAsString เป็นฟังก์ชั่นที่อ่านไฟล์ข้อความเป็นสตริง):

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

แต่ดูเหมือนว่าจะไม่ทำงาน

สิ่งนี้สามารถทำได้?


คุณต้องการกำจัดตัวแบ่งบรรทัดทั้งหมดหรือไม่ หรือคุณต้องการทำให้เป็นมาตรฐานเดียวกัน
helios

4
โอ้ถ้าคุณต้องการลบ linefeeds ทั้งหมดให้ลบทั้งหมด \ n และทั้งหมด \ r (เพราะ Windows linebreak คือ \ r \ n)
helios

เฮ้ FYI ถ้าคุณต้องการแทนที่ muti-linebreaks พร้อมกันด้วยตัวแบ่งบรรทัดเดียวจากนั้นคุณสามารถใช้ 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 ถูกต้อง ในฐานะที่เป็นเหตุผล: String คือไม่เปลี่ยนรูป replace()วิธีการส่งกลับผลที่ต้องการ โปรดดูเอกสาร API: java.sun.com/javase/6/docs/api/java/lang/… แก้ไข:อ่าคุณแก้ไขแล้วด้วยตัวคุณเองหลังจากนั้น :)
BalusC

75
อาจtext = text.replace("\r\n", " ").replace("\n", " ");เป็นทางออกที่ดีกว่า: มิฉะนั้นคำจะ "ติดกาว" กัน (โดยไม่มีการแทนที่ช่องว่างเดียว)
บาร์ต Kiers

9
คุณสามารถใช้วงเล็บเหลี่ยมเพื่อจับคู่บรรทัดใหม่ให้เหมาะสมกับระบบปฏิบัติการใด ๆ :.replaceAll("[\\r\\n]+", "")
Yeti

2
เนื่องจากคำถามกำลังขอให้แทนที่สิ่งที่เกิดขึ้นทั้งหมดวิธีแก้ปัญหาก็คือtext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@basZero replaceAllใช้เวลาใน regex 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

หากคุณต้องการที่จะลบเฉพาะ terminators บรรทัดที่ใช้ได้กับระบบปฏิบัติการปัจจุบันคุณสามารถทำได้:

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

หากคุณต้องการให้แน่ใจว่าคุณลบตัวแยกบรรทัดใด ๆ คุณสามารถทำสิ่งนี้ได้:

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

หรือ verbose เพิ่มเติมเล็กน้อย แต่ regexy น้อยกว่า:

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

2
เพื่อหลีกเลี่ยงการติดกาวคำด้วยกัน (ตามที่กล่าวไว้ในความคิดเห็นต่อคำตอบของ Kaleb) วิธีการ regex สามารถแก้ไขได้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", "");

แม้ว่าคำจำกัดความของการตัดแต่ง () ในเว็บไซต์ oracle คือ "ส่งคืนสำเนาของสตริงโดยเว้นช่องว่างนำหน้าและต่อท้าย"

เอกสารจะไม่กล่าวว่าอักขระบรรทัดใหม่ (นำหน้าและต่อท้าย) จะถูกลบด้วย

ในระยะสั้น String text = readFileAsString("textfile.txt").trim();จะทำงานให้คุณ (ตรวจสอบด้วย Java 6)


1

ฉันคิดว่ามันแปลกที่ (Apache) StringUtilsยังไม่ได้ครอบคลุมที่นี่

คุณสามารถลบ newlines ทั้งหมด (หรือเกิดขึ้นอื่น ๆ ของ substring สำหรับเรื่องนั้น) จากสตริงโดยใช้.replaceวิธีการ

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

บรรทัดนี้จะแทนที่บรรทัดใหม่ทั้งหมดด้วยสตริงว่าง

เนื่องจากการขึ้นบรรทัดใหม่เป็นเทคนิคอักขระคุณสามารถเลือกใช้.replaceCharsวิธีที่จะแทนที่อักขระได้

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

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

0

FYI หากคุณต้องการแทนที่การแบ่งบรรทัด muti พร้อมกันด้วยตัวแบ่งบรรทัดเดียวจากนั้นคุณสามารถใช้

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

หรือแทนที่ด้วยช่องว่างเดียว

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

0

คุณสามารถใช้ apache คอมมอนส์ 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 มันจะถูกแทนที่ดังนั้น \ จะยังคงอยู่เท่านั้น
Rob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.