web-dev-qa-db-ja.com

Javaでファイルから改行を削除する方法?

どのように私はWindowsとLinuxで動作するような方法でJavaの文字列からすべての改行を置き換えることができますか(すなわち、キャリッジリターン/ラインフィード/ニューラインなどのOS特有の問題がない)

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

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

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

どうすればこれができますか?

230
tree-hacker

texttext.replace()の結果に設定する必要があります。

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

これは文字列が不変であるために必要です。replaceを呼び出しても元の文字列は変更されず、変更された新しいものが返されます。結果をtextに代入しないと、その新しいStringは失われ、ガベージコレクトされます。

どんな環境でも改行文字列を取得することに関して - それはSystem.getProperty("line.separator")を呼び出すことによって利用可能です。

384
Kaleb Brasee

他の回答で述べたように、String.replace(...)はターゲット文字列を変更しないので、あなたのコードは主に動作していません。 (できません - Javaの文字列は不変です!)実際に行うことは、必要に応じて文字を変更して新しい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", " ");

これは各行の終端文字をスペースに置き換えます。

196
Stephen C

現在のOSで有効な行終端文字だけを削除したい場合は、次のようにします。

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

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

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

または、もう少し冗長ですが、正規表現は少なくなります。

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

この関数 は、改行を含むすべての空白を単一の空白に正規化します。元々の質問が求めていたものではありませんが、多くの場合必要とされるものを正確に実行する可能性があります。

import org.Apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
10
David McWhorter
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

一行おきに失敗して、たくさん検索した後、私のために完璧に働きました。

10
Renán D

これは効率的だと思います

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

構文ハイライト表示用に編集

9
JSBach

改行はwindows/linux/macでは同じではありません。属性line.separatorと共に System.getProperties を使用する必要があります。

6
Aif
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Oracle Webサイトでのtrim()の定義は「先頭と末尾の空白を省略した文字列のコピーを返します」です。

ドキュメントでは、改行文字(先頭と末尾の文字)も削除されるとは述べていません。

要するにString text = readFileAsString("textfile.txt").trim();もあなたのために働くでしょう。 (Java 6で確認済み)

3
MukeshKoshyM

あなたはあなたのファイルを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
Thomas Pornin
String text = readFileAsString("textfile.txt").replace("\n","");

.replaceは新しい文字列を返します。Javaの文字列は不変です。

3
Viktor Klang

(Apache) StringUtils がここでまだカバーされていなかったのは奇妙なことです。

.replaceメソッドを使用して、文字列からすべての改行(またはそれ以外の部分文字列の出現)を削除できます。

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

この行はすべての改行を空の文字列に置き換えます。

改行は技術的には文字なので、文字を置き換える.replaceCharsメソッドをオプションで使用できます。

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

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++;
    }

}
0

あなたが同時の複数行の改行を単一の改行に置き換えたい場合は、参考にしてください。

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

または1つのスペースに置き換える

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