जावा में फ़ाइल से लाइन ब्रेक कैसे हटाएं?


258

मैं जावा में एक स्ट्रिंग से सभी लाइन ब्रेक को इस तरह से कैसे बदल सकता हूं जो विंडोज और लिनक्स (यानी गाड़ी वापसी / लाइन फीड / नई लाइन आदि की कोई ओएस विशिष्ट समस्याओं) पर काम नहीं करेगा?

मैंने कोशिश की है (नोट readFileAsString एक फ़ंक्शन है जो एक टेक्स्ट फ़ाइल को स्ट्रिंग में पढ़ता है):

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

लेकिन यह काम नहीं करता है।

यह कैसे किया जा सकता है?


क्या आप सभी लाइन ब्रेक को खत्म करना चाहते हैं? या आप उन्हें एक मानक समाधान के लिए समान करना चाहते हैं?
हेलियोस

4
ओह, यदि आप सभी लाइनफीड हटाना चाहते हैं, तो सभी \ n और सभी \ r को हटा दें (क्योंकि विंडोज लाइनब्रेक \ r \ n है)।
हेलियोस

अरे, FYI करें अगर आप सिंगल लाइन ब्रेक के साथ एक साथ म्यूटि-लाइनब्रेक को बदलना चाहते हैं तो आप myString.trim().replaceAll("[\n]{2,}", "\n") सिंगल स्पेस के साथ उपयोग कर सकते हैं या बदल सकते हैं myString.trim().replaceAll("[\n]{2,}", " ")
सौरव चंद्रा

जवाबों:


435

आपको textइसके परिणामों पर सेट करने की आवश्यकता है text.replace():

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

यह आवश्यक है क्योंकि स्ट्रिंग्स अपरिवर्तनीय हैं - कॉलिंग replaceमूल स्ट्रिंग को परिवर्तित नहीं करता है, यह एक नया रिटर्न देता है जिसे बदल दिया गया है। यदि आप परिणाम को असाइन नहीं करते हैं text, तो वह नया स्ट्रिंग खो जाता है और कचरा एकत्र किया जाता है।

किसी भी वातावरण के लिए नई लाइन स्ट्रिंग प्राप्त करने के लिए - जो कॉल करके उपलब्ध है System.getProperty("line.separator")


1
+1, सही। कारण के रूप में: स्ट्रिंग अपरिवर्तनीय हैreplace()विधि रिटर्न वांछित परिणाम। एपीआई डॉक्स भी देखें: java.sun.com/javase/6/docs/api/java/lang/… संपादित करें: आह आप पहले से ही बाद में खुद को संपादित :)
BalusC

75
शायद text = text.replace("\r\n", " ").replace("\n", " ");एक बेहतर समाधान है: अन्यथा शब्द एक-दूसरे के लिए "चिपके" होंगे (एकल-स्थान प्रतिस्थापन के बिना)।
बार्ट कीर्स

9
तुम भी किसी भी ओएस के लिए ठीक से मेल खाने के लिए वर्ग कोष्ठक का उपयोग कर सकते हैं:.replaceAll("[\\r\\n]+", "")
यति

2
जैसा कि प्रश्न सभी घटनाओं को प्रतिस्थापित करने के लिए कह रहा है, समाधान इसके बजाय हैtext = text.replaceAll("\n", "").replaceAll("\r", "");
बेसोजेरो

2
@basZero रेगेक्स में replaceAllलेता है, replaceशाब्दिक तार लेता है, दोनों सभी घटनाओं को प्रतिस्थापित करते हैं।
जूनस वली

220

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, आपका कोड प्राथमिक रूप से काम नहीं कर रहा है क्योंकि String.replace(...)लक्ष्य नहीं बदलता है String। (यह नहीं हो सकता - जावा के तार अपरिवर्तनीय हैं!) replaceवास्तव Stringमें आवश्यक के रूप में बदले गए पात्रों के साथ एक नई वस्तु बनाने और वापस करने के लिए क्या करना है। लेकिन आपका कोड तब दूर फेंकता है String...


यहां कुछ संभव उपाय दिए गए हैं। कौन सा सबसे सही है यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

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

बस सभी न्यूलाइन वर्णों को हटा देता है। यह विंडोज या मैक लाइन समाप्ति के साथ सामना नहीं करता है।

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

वर्तमान प्लेटफ़ॉर्म के लिए सभी लाइन टर्मिनेटर निकालता है। यह उस मामले से सामना नहीं करता है जहां आप विंडोज पर एक UNIX फ़ाइल (उदाहरण के लिए) को संसाधित करने की कोशिश कर रहे हैं या इसके विपरीत।

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

सभी विंडोज, यूनिक्स या मैक लाइन टर्मिनेटर को हटा देता है। हालाँकि, यदि इनपुट फ़ाइल पाठ है, तो यह शब्दों को संक्षिप्त कर देगा; जैसे

Goodbye cruel
world.

हो जाता है

Goodbye cruelworld.

तो आप वास्तव में ऐसा करना चाह सकते हैं:

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

जो एक स्पेस के साथ प्रत्येक लाइन टर्मिनेटर को बदलता है। जावा 8 के बाद से आप यह भी कर सकते हैं:

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

और यदि आप एक जगह के साथ कई लाइन विभाजकों को बदलना चाहते हैं:

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

यह एक उत्कृष्ट उत्तर है। जावा 8 उदाहरणों के लिए कुदोस। सहायता के लिए धनयवाद!
16

22

यदि आप वर्तमान ओएस पर मान्य केवल लाइन टर्मिनेटर को हटाना चाहते हैं, तो आप ऐसा कर सकते हैं:

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

यदि आप यह सुनिश्चित करना चाहते हैं कि आप किसी भी लाइन विभाजक को हटा दें, तो आप इसे इस तरह से कर सकते हैं:

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

या, थोड़ा और अधिक क्रिया, लेकिन कम regexy:

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

2
शब्द को एक साथ देखने से बचने के लिए (जैसा कि कालेब के जवाब में टिप्पणियों में चर्चा की गई है) regex दृष्टिकोण को संशोधित किया जा सकता है text.replaceAll("(\\r|\\n)+", " ")(और यह मानते हुए कि लालची जावा में डिफ़ॉल्ट है?) आपके पास नई पंक्ति वर्णों के प्रत्येक अनुक्रम के लिए सिर्फ एक स्थान के साथ एक समाधान होगा ।
जॉर्न शॉ-रोड

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

बहुत खोज करने के बाद मेरे लिए पूरी तरह से काम किया, हर दूसरी पंक्ति के साथ असफल रहा।


6

लाइनब्रेक विंडोज़ / लिनक्स / मैक के तहत समान नहीं हैं। आपको विशेषता लाइन के साथ System.getProperties का उपयोग करना चाहिए ।


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

.replace एक नया स्ट्रिंग देता है, जावा में तार अपरिवर्तनीय हैं।


3

आप अपनी फ़ाइल को एक के साथ पढ़ना चाह सकते हैं BufferedReader। यह वर्ग व्यक्तिगत लाइनों में इनपुट को तोड़ सकता है, जिसे आप अपनी इच्छानुसार इकट्ठा कर सकते हैं। जिस तरह BufferedReaderसे वर्तमान प्लेटफॉर्म की परवाह किए बिना, स्वचालित रूप से लिनक्स, विंडोज और मैकओएस दुनिया के समापन सत्रों को मान्यता देता है।

अत:

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

भले ही ओरेकल वेबसाइट में ट्रिम () की परिभाषा "स्ट्रिंग की एक प्रति लौटाती है, जिसमें अग्रणी और अनुगामी व्हाट्सएप छोड़ा गया है।"

दस्तावेज़ीकरण यह कहने में चूक करता है कि नई लाइन वर्ण (लीडिंग और ट्रेलिंग) को भी हटा दिया जाएगा।

संक्षेप String text = readFileAsString("textfile.txt").trim();में भी आपके लिए काम करेगा। (जावा 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 करें यदि आप एकल लाइन विराम के साथ युगपत उत्परिवर्ती-रेखा-रेखाओं को बदलना चाहते हैं तो आप उपयोग कर सकते हैं

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

या एकल स्थान से प्रतिस्थापित करें

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

0

आप लाइन के माध्यम से पुनरावृति करने के लिए अपाचे कॉमन्स 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 है तो इसे बदल दिया जाएगा इसलिए केवल \ n ही रहेगा।
रॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.