3

BufferedReaderとScannerのnextLine()は、末尾の空白をすべて削除することで、少し助けすぎているようです。現時点では空の値として許可されている列を保持する必要がありますが、数百の列を持つ数百万の行が存在する可能性があるため、タブ文字を識別するnext()またはgetBytes()を使用して各行をループすることを躊躇します。

行を読むために私が見逃しているこれらの2つの方法に代わるものはありますか?空白を保持するためにこれらのメソッドに設定するフラグまたはその他のオプションはありますか?空白のないフィールドを使用するようにユーザーに強制するだけですか?空白を保持しようとしているのは私だけではありませんか?

ファイルからの読み取り時に問題が発生します。私はこのコードを持っています

import java.lang.*;
import java.util.*;
import java.io.*;

public class stringTest
{
   public static void main (String[] args) throws IOException
   {
        BufferedReader br = new BufferedReader(new FileReader("wtf.txt"));
        String l = br.readLine();
        while (l != null) {
            System.out.println(l.split("\t").length);
            l = br.readLine();
        }
   }
}

wtf.txtには

h\tu\tr\tf\n
o\tm\tg\t\t\n

そして出力は

4
3

さらに、すべてのタブである任意の場所に行を追加すると、

h\tu\tr\tf\n
\t\t\t\t\t\n
o\tm\tg\t\t\n

出力は

4
0
3

コードを使用する場合、分割の問題ではないと思います

String s = "w\tt\tf\t\t\n";
System.out.println(""+s.split("\t").length);
String s1 = "w\tt\tf\tx\n";
System.out.println(""+s1.split("\t").length);
String s2 = "\t\t\t\t\t\t\n";
System.out.println(""+s2.split("\t").length);

出力は

5
4
6
4

2 に答える 2

3

BufferedReader.readLine()空白を保持します。

于 2011-09-10T14:56:18.617 に答える
2

編集:あなたの問題はsplit、ではなく、に関係しているようBufferedReaderですScanner。あなたはそれらを方程式から非常に簡単に取り除くことができます:

public class Test {
    public static void main(String[] args) {
        String line = "\t\t\t";
        System.out.println(line.split("\t").length); // Prints 0
    }
}

区切り文字で文字列を分割するには、さまざまな方法があります。GuavaSplitterのクラスを確認することをお勧めします。

import java.util.List;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

public class Test {
    public static void main(String[] args) {
        Splitter splitter = Splitter.on('\t');
        String line = "\t\t\t";
        List<String> bits = Lists.newArrayList(splitter.split(line));
        System.out.println(bits.size()); // Prints 4
    }
}

BufferedReader.readLine() 確かに、末尾のタブは削除されません。サンプルコード:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        // Not closing anything just for convenience
        String text = "a\tb\t\r\nc\td\t";
        BufferedReader reader = new BufferedReader(new StringReader(text));

        String line;

        while ((line = reader.readLine()) != null)
        {
            System.out.println(line.replace("\t", "<tab>"));
        }
    }
}

出力:

a<tab>b<tab>
c<tab>d<tab>

同上Scanner.nextLine()

import java.io.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws IOException {
        // Not closing anything just for convenience
        String text = "a\tb\t\r\nc\td\t";
        Scanner scanner = new Scanner(new StringReader(text));

        while (scanner.hasNextLine())
        {
            String line = scanner.nextLine();
            System.out.println(line.replace("\t", "<tab>"));
        }
    }
}

(同じ出力。)

したがって、空白を削除するものは何でも、そうではありませScanner.nextLine()BufferedReader.readLine()

于 2011-09-10T14:57:34.247 に答える