javascript बड़ी फाइलों पर filereader एपीआई




html5 (2)

आपका एप्लिकेशन बड़ी फ़ाइलों के लिए असफल रहा है क्योंकि आप इसे संसाधित करने से पहले पूरी फ़ाइल को स्मृति में पढ़ रहे हैं। इस अक्षमता को फ़ाइल स्ट्रीम करके (छोटे आकार के टुकड़े पढ़ने) द्वारा हल किया जा सकता है, इसलिए आपको केवल स्मृति में फ़ाइल का एक हिस्सा पकड़ने की आवश्यकता है।

एक File ऑब्जेक्ट्स Blob का एक उदाहरण भी है, जो फ़ाइल के छोटे दृश्य को बनाने के लिए .slice विधि प्रदान करता है।

यहां एक उदाहरण दिया गया है जो मानता है कि इनपुट ASCII है (डेमो: http://jsfiddle.net/mw99v8d4/ )।

function findColumnLength(file, callback) {
    // 1 KB at a time, because we expect that the column will probably small.
    var CHUNK_SIZE = 1024;
    var offset = 0;
    var fr = new FileReader();
    fr.onload = function() {
        var view = new Uint8Array(fr.result);
        for (var i = 0; i < view.length; ++i) {
            if (view[i] === 10 || view[i] === 13) {
                // \n = 10 and \r = 13
                // column length = offset + position of \r or \n
                callback(offset + i);
                return;
            }
        }
        // \r or \n not found, continue seeking.
        offset += CHUNK_SIZE;
        seek();
    };
    fr.onerror = function() {
        // Cannot read file... Do something, e.g. assume column size = 0.
        callback(0);
    };
    seek();

    function seek() {
        if (offset >= file.size) {
            // No \r or \n found. The column size is equal to the full
            // file size
            callback(file.size);
            return;
        }
        var slice = file.slice(offset, offset + CHUNK_SIZE);
        fr.readAsArrayBuffer(slice);
    }
}

पिछले स्निपेट लाइन ब्रेक से पहले बाइट्स की संख्या की गणना करता है। मल्टीबाइट वर्णों वाले टेक्स्ट में वर्णों की संख्या को गिनना थोड़ा मुश्किल है, क्योंकि आपको संभावना है कि चंक में आखिरी बाइट मल्टीबाइट चरित्र का हिस्सा हो सकता है।

मेरा फ़ाइल रीडर एपीआई कोड अब तक अच्छा काम कर रहा है जब तक कि एक दिन मुझे अपने क्लाइंट में से एक से 280 एमबी टीटीटी फाइल नहीं मिली। पृष्ठ क्रोम में सीधे क्रैश हो जाता है और फ़ायरफ़ॉक्स में कुछ भी नहीं होता है।

// create new reader object 
var fileReader = new FileReader(); 

// read the file as text 
fileReader.readAsText( $files[i] );  
fileReader.onload = function(e) 
{   // read all the information about the file 
    // do sanity checks here etc... 
    $timeout( function() 
    {    
        // var fileContent = e.target.result;
        // get the first line 
        var firstLine = e.target.result.slice(0, e.target.result.indexOf("\n") ); }}

जो मैं ऊपर करने की कोशिश कर रहा हूं वह यह है कि पहली लाइन ब्रेक प्राप्त करें ताकि मैं फ़ाइल की कॉलम लम्बाई प्राप्त कर सकूं। क्या मुझे इसे पाठ के रूप में नहीं पढ़ना चाहिए? बड़ी फ़ाइलों पर पृष्ठ को तोड़ने के बिना मैं फ़ाइल की कॉलम लम्बाई कैसे प्राप्त कर सकता हूं?


पापा पार्स नामक एक भयानक लाइब्रेरी है जो इसे एक शानदार तरीके से करती है! यह वास्तव में बड़ी फ़ाइलों को संभाल सकता है और आप वेब कार्यकर्ता का भी उपयोग कर सकते हैं।

बस उन डेमो को आज़माएं जो वे प्रदान करते हैं: https://www.papaparse.com/demo





filereader