Javaでファイルから改行を削除するにはどうすればよいですか?


258

WindowsとLinuxで動作するように(つまり、復帰/改行/改行などのOS固有の問題がないように)Javaの文字列からすべての改行を置き換えるにはどうすればよいですか?

私は試しました(readFileAsStringはテキストファイルを文字列に読み込む関数です):

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

しかし、これはうまくいかないようです。

これはどのように行うことができますか?


すべての改行を削除しますか?または、それらを標準ソリューションに統一したいですか?
ヘリオ

4
ああ、すべての改行を削除したい場合は、\ nと\ rをすべて削除してください(Windowsの改行は\ r \ nであるため)。
helios

ねえ、FYI同時に複数の改行を単一の改行に置き換えたい場合は、使用する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に、その新しい文字列は失われ、ガベージコレクションされます。

あらゆる環境で改行文字列を取得することについては-を呼び出すことで利用できますSystem.getProperty("line.separator")


1
+1、正解。理由について:文字列は不変です。replace()この方法は、返し、所望の結果を。また、APIドキュメントを参照してください:java.sun.com/javase/6/docs/api/java/lang/… 編集:ああ、後で自分で編集したものです:)
BalusC

75
おそらくtext = text.replace("\r\n", " ").replace("\n", " ");より良い解決策です。そうでない場合、単語は互いに結合されます(単一スペースの置換なしで)。
Bart Kiers、2010年

9
あなたはまた、任意のOSに対して適切に改行を一致させるために、角括弧を使用することができます.replaceAll("[\\r\\n]+", "")
イエティ

2
問題はすべてのオカレンスを置き換えることを求めているので、解決策はかなりですtext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@basZero replaceAllは正規表現を受け入れ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"), "");

現在のプラットフォームのすべてのラインターミネータを削除します。これは、(たとえば)WindowsでUNIXファイルを処理しようとしている場合、またはその逆の場合には対応していません。

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

また、複数の行区切りを1つのスペースに置き換える場合は、次のようにします。

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

1
これは優れた答えです。Java 8の例に対する称賛。お手伝いありがとう!
HankNessip

22

現在のOSで有効な行ターミネーターのみを削除する場合は、次のようにします。

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

行区切り文字を確実に削除したい場合は、次のように実行できます。

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

または、少し冗長ですが、regexyは少なくなります。

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

2
接着避けるために一緒に単語(Kalebの答えにコメントで説明したように)正規表現のアプローチは、に変更することができtext.replaceAll("(\\r|\\n)+", " ")、あなただけで解決策になりますと(貪欲と仮定して、Javaのデフォルトのですか?)1つの改行文字の各シーケンスのためのスペースを。
–JørnSchou-Rode、2010

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のWebサイトでのtrim()の定義は、「先頭と末尾の空白を省略して、文字列のコピーを返します」です。

ドキュメントでは、改行文字(先頭と末尾)も削除されることを省略しています。

要するに String text = readFileAsString("textfile.txt").trim();あなたのためにも働くでしょう。(Java 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});
Lucas Crawford

0

参考までに、複数行の同時改行を単一の改行に置き換えたい場合は、

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

または単一のスペースに置き換える

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

0

Apache Commons 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を交換して\n\r\nもはや存在せず、\\ nがある場合は交換され、\のみが残ります。
Rob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.