1

分析のために解析しようとしている電子メールヘッダーデータのフラットファイルがあります。ファイルには、常に次の順序でフィールドがあります。レコード番号、1バイトまたは2バイト、"From:"送信者の名前、送信日が続き"Sent:"ます。

1 From: Person.Name Sent: April 12, 2010
2 From:<tab>Person.Name Sent: April 30, 2011
10 From: Person.Name Sent: June 29, 2012
11 From:<tab>Person.Name Sent: July 8, 2012

を使用しBufferedReaderて、ファイルを1行ずつ読み取り、とのインデックスの間のすべての文字に基づいて名前のサブストリングを定義してい"From:"ます"Sent:"

String sender = inputLine.substring((inputLine.indexof("From:")+6),(inputLine.indexOf("Sent:")-1));

この場合、「From:」(6番目のバイトは単語、コロン、およびコロンの後のスペース/ 1バイトを除く)の後に、「Sent:」( S)。

ただし、ジョブを実行すると予期しない出力が表示されます。一部の入力データの後にタブがあるように見え"From: "ますが、一部の行にはありません。タブが存在する場合、出力には最後の2バイトまたは3バイトが含まれます"From: "(レコード番号が1桁の場合、m:<tab>2桁のレコード番号の場合はom:<tab>

Person.Name
m:<tab>Person.Name        <-- single digit record number
Person.Name        
om:<tab>Person.Name       <-- double digit record number

編集:私が自分を修正するsubstringとき

String sender = inputLine.substring((inputLine.indexof("From:\t")+6),(inputLine.indexOf("Sent:")-1));

スペース(タブではない)のあるレコードのみが、の終わりをFrom:出力に付加します。

Person.Name        <-- records with From:<tab>
om: Person.Name    <-- records with From:<space>

私は今、私がsubstring正しく理解しているかどうか疑問に思っています。上記の私のステートメントは、文字列の開始と終了がsubstring(x,y)どこにあるかを理解していることに基づいています。あれは正しいですか?xy

indexOf( "From:")は、2または3の整数値を表すことを目的としているため(たとえば、1または2バイトのレコード番号に応じて1 From:10 From:、6の値を追加すると、次のようなインデックス値が得られると思います。:ラインの前からインデックス8または9の後に落ちます。では、なぜこれを5のインデックスと見なしているように見えるのでしょうか。

           111111111122222222222  |
 0123456789012345678901234567890  + index values
 1 From: Person.Name Sent: June
 10 From: Person.Name Sent: July

レコードの唯一の違いはタブです。タブ文字はASCIIスペース文字とは異なる方法でカウントする必要があることは理解していますが、インデックスからの減算は少し奇妙に思えます。

さらに興味深いことに、ステートメントから「調整」を削除すると、

     String sender = inputLine.substring((inputLine.indexof("From:")),(inputLine.indexOf("Sent:")));

-1 out of range例外が発生します。

誰かがここで何が起こっているのか説明してもらえますか?私は困惑していて、オラクルのJavaドキュメントでこれに固有の答えを見つけることができません。

4

1 に答える 1

0

最終的に、\tをスペースに置き換えた新しい入力フィールドを作成しました。その後、すべてが正常に機能しました。物事を捨てたのはタブキャラクターについてでしたが、それでも謎です。

于 2012-08-08T19:42:41.543 に答える