3

私は次のファイルを持っています:

file.csv

header:2013/01/01, shasum: 495629218484151218892233214
content:data,a,s,d,f,g,h,j,k,l
content:data,q,w,e,r,t,y,u,i,o,p
content:data,z,x,c,v,b,n,m
footer:2013/01/01 EOF

コンテンツのハッシュを計算する必要があります。言い換えると、ヘッダーとフッターのないファイルコンテンツのハッシュを計算し、ソースからのヘッダーで提供されているものと一致することを確認する必要があります。scannerヘッダーとフッターを使用して、ファイルを1行ずつ読み取ってみました。

Scanner reader = new Scanner(new FileReader("filename"));
String header = reader.nextLine();
while(reader.hasNextLine()){
    line = reader.nextLine();
    if(reader.hasNextLine()){
        md.update(line.getBytes());
        md.update(NEW_LINE.getBytes());
    }
}

ここでは、ファイルがどこから来ているのかわかりません。WindowsまたはUnixから来ている可能性があります。では、どうすれば何NEW_LINEを使うべきかを知ることができます。そのために私はこの汚いハックを書きました。

int i;
while((i = br.read()) != -1){
    if(i == '\r'){
        if(br.read() == '\n'){
            NEW_LINE = "\r\n";
            break;
        }
    } else if(i == '\n'){
        NEW_LINE = "\n";
        break;
    }
}

\r\n基本的に、またはの最初のシーケンスを探しています\n。最初に遭遇するものは何でも、それは改行文字であると想定します。

私のファイルがCRLFとLFの両方の混合である場合、これは間違いなく私を困らせるでしょう。2つのオフセットを提供できるリーダーの恩恵を受ける可能性があり、それらの2つのオフセット間のコンテンツが返されます。そのようです:

reader.read(15569, 236952265);

私が望む2つのオフセットは計算できると思います。コミュニティからの提案は大歓迎です。

4

1 に答える 1

1

コメントで思っていたよりも、RandomAccessFileクラスを使うだけでいいのです!

// Load in the data file in read-only mode:
RandomAccessFile randFile = new RandomAccessFile("inputFileName.txt", "r");

// (On your own): Calculate starting byte to read from
// (On your own): Calculate ending byte to read from

// Discard header and footer.
randFile.setLength(endingPoint);
randFile.seek(startingPoint);

// Discard newlines of any kind as they are read in.
StringBuilder sb = new StringBuilder(endingPoint - startingPoint);
String currentLine = "";
while(currentLine != null)
{
  sb.append(currentLine);
  currentLine = randFile.readLine();
}

// hash your String contained in your StringBuilder without worrying about
// header, footer or newlines of any kind.

このコードは例外をキャッチせず、1つずつエラーが発生する可能性があるため、本番品質ではないことに注意してください。RandomAccessFileクラスのドキュメントを読むことを強くお勧めします:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/RandomAccessFile.html#readLine()

これがお役に立てば幸いです。私がベースから離れている場合は、私に知らせてください、そして私はそれに別のショットを与えます。

于 2013-01-17T20:59:08.890 に答える