Lecture ligne par ligne du fichier en JavaScript côté client
Pourriez-vous m'aider avec le problème suivant.
Objectif
Lire le fichier sur le côté client (dans le navigateur via JS et HTML5 classes), ligne par ligne, sans avoir à charger tout le fichier en mémoire.
Scénario
Je suis en train de travailler sur une page web qui doit analyser les fichiers sur le côté client. Actuellement, je suis en train de lire fichier tel qu'il est décrit dans ce l'article.
HTML:
<input type="file" id="files" name="files[]" />
JavaScript:
$("#files").on('change', function(evt){
//creating FileReader
var reader = new FileReader();
//assigning handler
reader.onloadend = function(evt) {
lines = evt.target.result.split(/\r?\n/);
lines.forEach(function (line) {
parseLine(...);
});
};
//getting File instance
var file = evt.target.files[0];
//start reading
reader.readAsText(file);
}
Le problème est que FileReader lit tout le fichier à la fois, ce qui provoque écrasé onglet pour les gros fichiers (taille >= 300 MO). À l'aide de reader.onprogress
ne résout pas un problème, puisqu'il vient incréments de suite jusqu'à ce qu'il va frapper à la limite.
Inventer une roue
J'ai fait quelques recherches sur internet et n'ont pas trouvé de moyen simple de le faire (il y a des tas d'articles décrivant précisément cette fonctionnalité, mais sur le côté serveur pour node.js).
Comme seul moyen de le résoudre, je ne vois que des points suivants:
- Diviser le fichier en morceaux (via
File.split(startByte, endByte)
méthode) - Trouver le dernier caractère de nouvelle ligne dans ce morceau ('/n')
- Lire ce morceau à l'exception de la partie après le dernier caractère de nouvelle ligne et de le convertir à la chaîne et divisé par des lignes
- Lire la partie suivante de départ à partir du dernier caractère de nouvelle ligne trouvé à l'étape 2
Mais je vais mieux utiliser quelque chose de déjà existant afin d'éviter la croissance de l'entropie.
Vous devez vous connecter pour publier un commentaire.
Finalement, j'ai créé de nouveaux, ligne par ligne, lecteur, ce qui est totalement différente de la précédente.
Caractéristiques sont les suivantes:
Cochez cette jsFiddle pour des exemples.
Utilisation:
Performance est identique à la solution précédente. Vous pouvez mesurer l'invocation de "Lire" dans jsFiddle.
GitHub: https://github.com/anpur/client-line-navigator/wiki
Mise à jour: vérifier LineNavigator de ma deuxième réponse au lieu de cela, le lecteur est bien mieux.
J'ai fait mon propre lecteur, qui répond à mes besoins.
Performance
Que le problème est uniquement lié à des fichiers de grande performance a été la partie la plus importante.
Comme vous pouvez le voir, la performance est presque la même que la lecture directe (comme décrit à la question ci-dessus).
Actuellement, je suis en train d'essayer de le rendre meilleur, plus grand, plus de temps de consommation est appel asynchrone pour éviter la pile des appels la limite de frapper, ce qui n'est pas inutile pour l'exécution de problème.problème de Performance résolu.Qualité
Cas suivants ont été testés:
Code & Utilisation
Html:
Utilisation:
Code:
J'ai écrit un module nommé ligne-lecteur-navigateur pour le même but. Il utilise
Promises
.Syntaxe (Caractères D'Imprimerie):-
Utilisation:-
Essayez l'extrait de code suivant pour voir le module de travail.
HTML:
Espérons qu'il sauve quelqu'un du temps!