Optimiser lecture et traitement gros fichiers textes
Tarz974
Messages postés10Date d'inscriptiondimanche 2 mars 2008StatutMembreDernière intervention 7 août 2015
-
7 août 2015 à 11:27
@karamel
Messages postés1850Date d'inscriptionvendredi 9 mai 2008StatutModérateurDernière intervention 4 mars 2024
-
9 août 2015 à 12:17
Bonjour,
Débutant en Javascript, je développe un Chrome App et cherche à lire ligne par ligne un fichier texte qui peut être lourd et à effectuer des traitements de reconnaissance de données dessus. (Plus concrètement, il s'agit d'un fichier .dxf).
Pour le moment, j'utilise .readAsText(file) que je splitte ensuite dans un tableau de lignes, mais ce n'est pas du tout optimisé.
Comment faire pour traiter le fichier comme un flux ? Je crois qu'on doit pouvoir utiliser fgets, mais la syntaxe m'échappe complètement. Voudriez-vous m'aider à modifier le code ci-dessous pour qu'il fonctionne en lisant ligne par ligne un fichier mis en ouverture?
function chooseFileToOpen() { chrome.fileSystem.chooseEntry( { type: 'openFile', accepts:[ { extensions: ["dxf"] } ] }, function(fileEntry) { if (!fileEntry) { console.log("User did not choose a file"); return; } fileEntry.file(function(file) { var reader = new FileReader(); //on définit dans .onload ce qu'il faut faire une fois le fichier chargé reader.onload = function(e) { fullStringToLines(e.target.result); }; reader.onabort = function(e) { console.log("Chargement du fichier interrompu"); }; reader.onerror = function(e) { console.log("Une erreur est survenue au chargement du fichier"); }; reader.readAsText(file); console.log("Fichier en cours de chargement"); }); } ); } function calcLines(fullString) { var lines = fullString.replace(/\r\n/g, "\n").split("\n"); //on remplace \r\n par \n puis on coupe à chaque \n for (var i = 0; i < lines.length; i++) { lines[i] = lines[i].replace(/^\s+|\s+$/g,''); //on trime les espaces de part et d'autre de la chaine } var nbr = 0, object = 0, nbr_hidden_layer = 0, nbr_block = 0; var visible; //boolean var nameLayer = []; var nameBlock = [], posBlockInFile = [], offsetBlockX = [], offsetBlockY = []; for (i = 0; i < lines.length; i++) { type = 9999; visible = true; if (lines[i] == "LAYER") { while(lines[i+1] !== "" && type !== 0) { i++; type = parseInt(lines[i]); if (type === 0) { if (nameLayer[nbr_hidden_layer] !== undefined && visible === false) { if(nbr_hidden_layer < 99) { nbr_hidden_layer++; console.log("On a ajouté le calque " + nameLayer[nbr_hidden_layer-1] + " au tableau des invisibles"); } break; //ce break fait sortir de la boucle for } } switch(type) { case 2: // Name i++; nameLayer[nbr_hidden_layer] = lines[i]; break; case 62: // <0 invisible (color number) i++; if (parseInt(lines[i]) < 0) { visible = false; console.log(nameLayer[nbr_hidden_layer]+" a une value négative du group code 62, donc invisible"); } break; default: // Ignore i++; break; } } } } }
A voir également:
Optimiser lecture et traitement gros fichiers textes
@karamel
Messages postés1850Date d'inscriptionvendredi 9 mai 2008StatutModérateurDernière intervention 4 mars 2024152 Modifié par kazma le 9/08/2015 à 12:17
bonjour
en utilisant split(/n) on lit le fichier en fonction des saut de ligne