Optimiser lecture et traitement gros fichiers textes

Tarz974 Messages postés 10 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 7 août 2015 - 7 août 2015 à 11:27
@karamel Messages postés 1855 Date d'inscription vendredi 9 mai 2008 Statut Modérateur Dernière intervention 18 avril 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;
}
}
}
}
}

1 réponse

@karamel Messages postés 1855 Date d'inscription vendredi 9 mai 2008 Statut Modérateur Dernière intervention 18 avril 2024 153
Modifié par kazma le 9/08/2015 à 12:17
bonjour

en utilisant split(/n) on lit le fichier en fonction des saut de ligne

<!doctype html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <head>
 
 <script type="text/javascript">

function charger(e){
  
 var fichier = e.target.files;
  
 var charge=new FileReader();
  
 charge.readAsText(fichier[0]);
  
 charge.onloadend = function(e){
    
  var items =e.target.result.split('\n')
alert(items[0])
alert(items[1])
alert(items[2])
alert(items[3])
alert(items[4])
alert(items[5])
alert(items[6])
alert(items[7])
   }
};

</script>
</head>
<body>
<br>
<input type='file' onchange='charger(event)'>
<br>
</body>
</html>


rien ne sert de courir il faut partir a point.
cours Forest cours !
0
Rejoignez-nous