Jak usunąć podziały linii z pliku w Javie?

258

Jak mogę zastąpić wszystkie podziały wiersza z ciągu znaków w Javie w taki sposób, aby działał w systemach Windows i Linux (tzn. Nie występują problemy specyficzne dla systemu operacyjnego dotyczące powrotu karetki / przesunięcia wiersza / nowej linii itp.)?

Próbowałem (uwaga readFileAsString to funkcja, która odczytuje plik tekstowy do ciągu):

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

ale to nie działa.

Jak można to zrobić?

haker drzewa
źródło
Czy chcesz wyeliminować wszystkie przerwy w linii? A może chcesz ujednolicić je do standardowego rozwiązania?
helios
4
Och, jeśli chcesz usunąć wszystkie źródła, usuń wszystkie \ n ORAZ wszystkie \ r (ponieważ podział linii w systemie Windows to \ r \ n).
helios
Hej, FYI, jeśli chcesz zastąpić jednoczesne dzielenie muti linią pojedynczą linią, możesz użyć myString.trim().replaceAll("[\n]{2,}", "\n") Lub zastąpić jedną spacją myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra,

Odpowiedzi:

435

Musisz ustawić textna wyniki text.replace():

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

Jest to konieczne, ponieważ ciągi są niezmienne - wywołanie replacenie zmienia oryginalnego ciągu, zwraca nowy, który został zmieniony. Jeśli nie przypiszesz wyniku text, nowy ciąg zostanie utracony, a śmieci zostaną zebrane.

Jeśli chodzi o uzyskanie ciągu nowego wiersza dla dowolnego środowiska - jest to dostępne przez wywołanie System.getProperty("line.separator").

Kaleb Brasee
źródło
1
+1, poprawne. Jeśli chodzi o powód: ciąg jest niezmienny . replace()Sposób powraca do pożądanego rezultatu. Zobacz także dokumentację API: java.sun.com/javase/6/docs/api/java/lang/… Edycja: ah sam już to później
edytowałeś
75
Być może text = text.replace("\r\n", " ").replace("\n", " ");jest to lepsze rozwiązanie: w przeciwnym razie słowa zostaną „sklejone” ze sobą (bez zamiany pojedynczej spacji).
Bart Kiers
9
Możesz także użyć nawiasów kwadratowych, aby poprawnie dopasować znaki nowej linii dla dowolnego systemu operacyjnego:.replaceAll("[\\r\\n]+", "")
Yeti
2
Ponieważ pytanie dotyczy zastąpienia WSZYSTKICH wystąpień, rozwiązanie jest raczejtext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero
2
@basZero replaceAllprzyjmuje wyrażenia regularne, replaceprzyjmuje dosłowne ciągi znaków, oba zastępują wszystkie wystąpienia.
Joonas Vali,
220

Jak zauważono w innych odpowiedziach, twój kod nie działa przede wszystkim dlatego, String.replace(...)że nie zmienia celu String. (Nie może - ciągi Java są niezmienne!) W replacerzeczywistości polega na utworzeniu i zwróceniu nowego Stringobiektu ze zmienionymi znakami zgodnie z wymaganiami. Ale twój kod wyrzuca to String...


Oto kilka możliwych rozwiązań. To, który jest najbardziej poprawny, zależy od tego, co dokładnie próbujesz zrobić.

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

Po prostu usuwa wszystkie znaki nowej linii. Nie radzi sobie z zakończeniami linii w systemie Windows lub Mac.

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

Usuwa wszystkie terminatory linii dla bieżącej platformy. Nie dotyczy to przypadku, gdy próbujesz przetworzyć (na przykład) plik UNIX w systemie Windows lub odwrotnie.

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

Usuwa wszystkie terminatory linii w systemie Windows, UNIX lub Mac. Jeśli jednak plik wejściowy to tekst, spowoduje to konkatenację słów; na przykład

Goodbye cruel
world.

staje się

Goodbye cruelworld.

Więc możesz chcieć to zrobić:

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

który zastępuje każde zakończenie linii spacją. Od wersji Java 8 możesz to również zrobić:

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

A jeśli chcesz zastąpić wiele separatorów linii jedną spacją:

// #6
text = text.replaceAll("\\R+", " ");
Stephen C.
źródło
1
To jest DOSKONAŁA odpowiedź. Wyrazy uznania dla przykładów Java 8. Dziękuję za pomoc!
HankNessip
22

Jeśli chcesz usunąć tylko terminatory linii, które są ważne w bieżącym systemie operacyjnym, możesz to zrobić:

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

Jeśli chcesz się upewnić, że usunąłeś separatory linii, możesz to zrobić w następujący sposób:

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

Lub nieco bardziej gadatliwy, ale mniej zwrotny:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Fabian Steeg
źródło
2
Aby uniknąć sklejenia słowa razem (jak omówiono w komentarzach do odpowiedzi Kaleba), można zmodyfikować podejście wyrażenia regularnego text.replaceAll("(\\r|\\n)+", " ")i (zakładając, że w Javie jest zachłanny?), Będziesz mieć rozwiązanie z jedną spacją dla każdej sekwencji nowych znaków wiersza.
Jørn Schou-Rode
19

Ta funkcja normalizuje wszystkie białe spacje, w tym łamanie linii, do pojedynczych spacji. Nie do końca to, o co pytało pierwotne pytanie, ale w wielu przypadkach może zrobić dokładnie to, co jest potrzebne:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
David McWhorter
źródło
14

Myślę, że byłoby to skuteczne

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
JSBach
źródło
Upewnij się, że masz dokładnie ten sam kod, zamiast tracić znaki „\ n” podczas wklejania. Ponieważ to powinno działać. Może dlatego, że na końcu zapomniałem ostatniego średnika (;).
JSBach,
11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Po wielu poszukiwaniach działał dla mnie idealnie, ponieważ zawiodłem przy każdej innej linii.

Renán D.
źródło
6

Podziały linii nie są takie same w systemach Windows / Linux / Mac. Powinieneś użyć System.getProperties z atrybutem line.separator.

Aif
źródło
3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace zwraca nowy ciąg, ciągi w Javie są niezmienne.

Viktor Klang
źródło
3

Możesz przeczytać swój plik za pomocą BufferedReader. Ta klasa może dzielić dane wejściowe na pojedyncze linie, które można dowolnie zestawiać. Sposób BufferedReaderdziałania automatycznie rozpoznaje konwencje zakończenia linii w środowiskach Linux, Windows i MacOS, niezależnie od bieżącej platformy.

W związku z tym:

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

Zauważ, że readLine()nie zawiera terminatora linii w zwracanym ciągu. Powyższy kod dodaje spację, aby uniknąć sklejenia ze sobą ostatniego słowa linii i pierwszego słowa następnego wiersza.

Thomas Pornin
źródło
3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Mimo że definicja trim () w witrynie internetowej oracle brzmi „Zwraca kopię ciągu, z pominięciem początkowych i końcowych białych znaków”.

dokumentacja pomija stwierdzenie, że nowe znaki linii (wiodące i końcowe) również zostaną usunięte.

W skrócie String text = readFileAsString("textfile.txt").trim();będzie również dla ciebie działać. (Sprawdzone w Javie 6)

MukeshKoshyM
źródło
1

Wydaje mi się dziwne, że (Apache) StringUtils nie został jeszcze tutaj opisany.

możesz usunąć wszystkie znaki nowej linii (lub dowolne inne wystąpienia podciągów w tym przypadku) z ciągu przy użyciu tej .replacemetody

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

Ta linia zastąpi wszystkie nowe wiersze pustym ciągiem.

ponieważ newline jest technicznie znakiem, możesz opcjonalnie użyć .replaceCharsmetody, która zastąpi znaki

StringUtils.replaceChars(myString, '\n', '');
svarog
źródło
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford
0

Do Twojej wiadomości, jeśli chcesz zastąpić jednoczesne łamanie linii muti pojedynczym łamaniem linii, możesz użyć

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

Lub zastąp jedną spacją

myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra
źródło
0

Za pomocą apache commons IOUtils można iterować po linii i dołączać każdą linię do StringBuilder. I nie zapomnij zamknąć 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
źródło
0

Możesz użyć ogólnych metod, aby zastąpić dowolny znak dowolnym znakiem.

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
źródło
-1

org.apache.commons.lang.StringUtils # chopNewline

Kumar Abhishek
źródło
2
-1, ponieważ przestarzałe i usuwa tylko na końcu łańcucha.
João Farias,
-2

Spróbuj to zrobić:

 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
źródło
5
jeśli zamienisz, \nnie będzie \r\njuż żadnego, jeśli zamienisz \ n i jest \\ n zostanie on zastąpiony, więc pozostanie tylko \.
Rob