39

解析する必要がある長いファイルがあります。非常に長いので、チャンクごとに行う必要があります。私はこれを試しました:

function parseFile(file){
    var chunkSize = 2000;
    var fileSize = (file.size - 1);

    var foo = function(e){
        console.log(e.target.result);
    };

    for(var i =0; i < fileSize; i += chunkSize)
    {
        (function( fil, start ) {
            var reader = new FileReader();
            var blob = fil.slice(start, chunkSize + 1);
            reader.onload = foo;
            reader.readAsText(blob);
        })( file, i );
    }
}

実行した後、コンソールに最初のチャンクしか表示されません。「console.log」を jquery に変更して一部の div に追加すると、その div の最初のチャンクのみが表示されます。他のチャンクはどうですか?それを機能させる方法は?

4

5 に答える 5

10

Response ( fetchの一部) を利用して、ほとんどのものを他の blob、text、json に変換し、Blob をチャンクで読み取るのに役立つ ReadableStream を取得することもできます。

var dest = new WritableStream({
  write (str) {
    console.log(str)
  }
})

var blob = new Blob(['bloby']);

(blob.stream ? blob.stream() : new Response(blob).body)
  // Decode the binary-encoded response to string
  .pipeThrough(new TextDecoderStream())
  .pipeTo(dest)
  .then(() => {
    console.log('done')
  })

古い回答(WritableStreams pipeTo および pipeThrough は以前に実装されていませんでした)

ブロブを ReadableByteStreamReader に変換するため、おそらく非常に高速な興味深いアイデアを思いつきました。チャンクサイズやオフセットなどを処理し、ループですべて再帰的に実行する必要がないため、おそらくはるかに簡単です。

function streamBlob(blob) {
  const reader = new Response(blob).body.getReader()
  const pump = reader => reader.read()
  .then(({ value, done }) => {
    if (done) return
    // uint8array chunk (use TextDecoder to read as text)
    console.log(value)
    return pump(reader)
  })
  return pump(reader)
}

streamBlob(new Blob(['bloby'])).then(() => {
  console.log('done')
})

于 2016-06-02T18:35:12.613 に答える
8

の 2 番目の引数は、slice実際には終了バイトです。コードは次のようになります。

 function parseFile(file){
    var chunkSize = 2000;
    var fileSize = (file.size - 1);

    var foo = function(e){
        console.log(e.target.result);
    };

    for(var i =0; i < fileSize; i += chunkSize) {
        (function( fil, start ) {
            var reader = new FileReader();
            var blob = fil.slice(start, chunkSize + start);
            reader.onload = foo;
            reader.readAsText(blob);
        })(file, i);
    }
}

または、これを使用しBlobReaderてインターフェイスを簡単にすることもできます。

BlobReader(blob)
.readText(function (text) {
  console.log('The text in the blob is', text);
});

詳しくは:

于 2013-02-04T14:23:30.023 に答える
3

簡単な方法を使用して、大きなファイルを小さなチャンクに解析します。

                //Parse large file in to small chunks
                var parseFile = function (file) {

                        var chunkSize = 1024 * 1024 * 16; //16MB Chunk size
                        var fileSize = file.size;
                        var currentChunk = 1;
                        var totalChunks = Math.ceil((fileSize/chunkSize), chunkSize);

                        while (currentChunk <= totalChunks) {

                            var offset = (currentChunk-1) * chunkSize;
                            var currentFilePart = file.slice(offset, (offset+chunkSize));

                            console.log('Current chunk number is ', currentChunk);
                            console.log('Current chunk data', currentFilePart);

                            currentChunk++;
                        }
                };
于 2018-09-13T20:43:15.963 に答える