2011-02-08 8 views
0

Javaでは、異種データ(数字と文字)を高速に解析する必要があります。java、ファイルからデータを解析するByteBuffer

私はByteBufferとメモリマップファイルについて読んできました。

私はそれをコピーすることができますが、データを解析するときは面倒です。私はさまざまなバイトを割り当てることをやりたいのですが。しかし、それはエンコーディングに依存するようになりますか?

ファイルの形式は、例えば、ある場合:

someString 8
some other string 88

私はStringまたはIntegerオブジェクトにそれを解析できますか?

ありがとうございます!

Udo。

+1

、そして、私はバッファ*で始まります*リーダーとしてのベース。 ByteBufferはいくつかの点で良いです。これは一般的ではありません。 –

答えて

2

は、あなたが改行を検索し、あなたが最初のスペースを見つけるまで後方に作業する必要がある

{string possibly with spaces} {integer}\r?\n 

のようなものです。数字を自分でデコードしてintに変換するか、それを文字列に変換して解析することができます。あなたがしなければ私は整数を使用しません。ラインの開始位置と整数の始まりを知ったら、文字列をバイトとして抽出し、必要なエンコーディングを使ってStringに変換できます。

これは、改行とスペースがエンコーディングで1バイトであることを前提としています。マルチバイトのバイトであれば、さらに複雑になります。

EDIT:次の例のプリント...

text: ' someString', number: 8 
text: 'some other string', number: -88 

コード

ByteBuffer bb = ByteBuffer.wrap(" someString 8\r\nsome other string -88\n".getBytes()); 
while(bb.remaining()>0) { 
    int start = bb.position(),end, ptr; 
    for(end = start;end < bb.limit();end++) { 
     byte b = bb.get(end); 
     if (b == '\r' || b == '\n') 
      break; 
    } 
    // read the number backwards 
    long value = 0; 
    long tens = 1; 
    for(ptr = end-1;ptr>= start;ptr--) { 
     byte b = bb.get(ptr); 
     if (b >= '0' && b <= '9') { 
      value += tens * (b - '0'); 
      tens *= 10; 
     } else if (b == '-') { 
      value = -value; 
      ptr--; 
      break; 
     } else { 
      break; 
     } 
    } 
    // assume separator is a space.... 
    byte[] bytes = new byte[ptr-start]; 
    bb.get(bytes); 
    String text = new String(bytes, "UTF-8"); 
    System.out.println("text: '"+text+"', number: "+value); 

    // find the end of the line. 
    if (bb.get(end) == '\r') end++; 
    bb.position(end+1); 
} 
1

あなたはこの方法でそれを試すことができます。

CharacterIterator it = new StringCharacterIterator(StringBuffer.toString()); 
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) { 
    if (Character.isDigit(c)) { 
     // character is digit 
    } else { 
     // character is not-digit 
    } 
} 

それとも、

String str = StringBuffer.toString(); 
String numbers = str.replaceAll("\\D", ""); 
String letters = str.replaceAll("\\W", ""); 

を好む場合は、正規表現を使用することができます次に、あなたの文字列numbers内の文字の上にいつものようにInteger.parseInt()を実行する必要があります。あなたの形式を想定し

+0

ありがとうございますが、より具体的なByteBuffer実装を探していました。 – ssedano

+0

ByteBufferは、いくつかのコンテンツに基づいて 'Strings' _and_' Integers'を与えていますか? –

+0

情報のチャンクを読み込み、文字列または整数に "解析する" ... – ssedano

0

は、あなたがjava.util.Scannerをお探しですか?あなたが本当にエキゾチックな性能要件がない限り、それは十分に高速である必要があります:順次アクセスし、「テキスト」と「テキストとして保存された整数を」読んで主要ユースケースの場合

Scanner s = new Scanner(new File("C:\\test.txt")); 
    while (s.hasNext()) { 
     String label = s.next(); 
     int number = s.nextInt(); 

     System.out.println(number + " " + label); 
    } 
+0

私はByteBufferでそれを行う方法を学びたいと思います。 – ssedano

+2

なぜですか?パフォーマンスへの影響が追加の努力を正当化することを確認しましたか? – meriton

+0

それは良い点ですが、私はこれを使ってどのように使用するのかを学んでいます。 – ssedano

関連する問題