2009-06-09 6 views
2

Pour un ensemble donné de fichiers texte, je dois trouver chaque caractère "\" et le remplacer par "\\". C'est un système Windows, et mes options de langage de script sont Javascript, VBScript ou Perl.Amélioration de l'algorithme d'entrées/sorties de mon fichier

Ces fichiers sont gros (~ 10Mo par pièce), et ils sont nombreux (~ 15 000). Je suis déjà venu avec le Javascript suivant:

function EscapeSlashes(inFilePath) 
{ 
    var readOnly = 1; 
    var fso = WScript.CreateObject("Scripting.FileSystemObject"); 
    var outFile = fso.CreateTextFile(inFilePath + "escaped.js", true); 
    var inFile = fso.OpenTextFile(inFilePath, readOnly); 

    var currChar; 
    while(!inFile.AtEndOfStream) 
    { 
     currChar = inFile.Read(1); 

     //check for single backslash 
     if(currChar != "\\") 
     { 
      outFile.Write(currChar); 
     } 
     else 
     { 
      //write out a double backslash 
      outFile.Write("\\\\"); 
     } 
    } 

    outFile.Close(); 
    inFile.Close(); 
} 

Je suis inquiet que ce qui précède pourrait être un peu lent. Y a-t-il un moyen d'améliorer l'algorithme? Puisque je remplace un personnage par deux, je ne pense pas que cela puisse être fait sur place.

Y at-il un avantage de performance à lire ligne par ligne, plutôt que caractère par caractère?

Est-ce que Perl ou VBScript ont des avantages par rapport à Javascript dans ce cas?

Répondre

4

Vous ne pouvez pas le faire sur place, mais en général c'est une bonne idée de lire des données en morceaux plutôt que de lire une seule valeur à la fois. Lisez un morceau, puis parcourez-le. Lire un autre morceau, etc - jusqu'à ce que le "morceau" soit de longueur 0, ou que l'appel à Read indique la fin du flux. (Sur la plupart des plates-formes, l'appel à Read peut indiquer que vous devez appeler une fonction AtEndOfStream distincte.)

De même, je ne serais pas surpris si Perl pouvait le faire sur une seule ligne. Ou utilisez sed si vous pouvez :)

0

Comme Jon a dit, Perl pourrait être le bon choix.
Si vous le pouvez, utilisez cygwin (que je pense avoir les outils nécessaires pour une telle chose).

3

Je suggère de lire et d'écrire des morceaux plus gros (que ce soit des lignes ou un grand nombre d'octets). Cela devrait réduire l'IO que vous devez faire et vous permettre de courir plus vite. Cependant, vos fichiers peuvent être trop volumineux pour être manipulés facilement en mémoire tous ensemble. Jouez avec des tailles de lecture/écriture et voyez ce qui est le plus rapide pour vous.

3
perl -spi.og -e 's/\\/\\\\/gm' infile 

Laissez-vous réinséré et infile.og comme sauvegarde.

2

C'est le genre de tâche pour lequel Perl est construit et ce serait certainement plus rapide, mais seulement si vous êtes déjà familier avec la langue. Cela étant dit, vous pouvez facilement modifier votre code JavaScript en lisant dans un tampon plus grand et en faisant votre remplacement avec une regex. Jetez un oeil à la méthode String.replace.

Questions connexes