Remplacement de chaîne dans un fichier
Actuellement je travaille sur des fichiers XML de 8-10 Mo. Je remplace des chaînes de caractères par-ci par-là. Mon souci est simple, comment faire pour remplacer un bout de texte sans perdre trois jours ?
- Visual Studio prend des ressources astronomiques et un temps fou à cause de toute la mise en page graphique du fichier XML et de sa gestion du retour à l'état précédent... Autrement dit, remplacer une chaîne selon une expression régulière me laisse à chaque fois le temps de faire une petite sieste et occupe jusqu'à 550 Mo de ma RAM, si j'ai le malheur d'avoir 2 de ces fichiers ouverts.
- Mon fidèle notepad croule sous la tâche avec un simple remplacement de chaîne.
Du coup, j'ai fait une petite appli en C# (Framework 2.0) qui permet de remplacer du texte en ligne de commande selon une chaîne classique de caractères ou une expression régulière. Sur mes fichiers de 8-10Mo, le résultat est quasi instantanné.
StrReplace.exe ExpressionATrouver Remplacement FichierSource [FichierDestination]
Voici le code :
using System; using System.IO; using System.Text.RegularExpressions; namespace StrReplace { public class Program { static void Main(string[] args) { if (args.Length < 3) { Console.WriteLine("\nStrReplace.exe OldExpr NewExpr FileSrc [FileDest]"); return; } string oldExpr = args[0]; // String or RegEx pattern to find string newExpr = args[1]; // Replacement string strFileSrc = args[2]; // Source filename string content = string.Empty; // Source file content string strFileDest = string.Empty; // Destination filename if different
// Reading of the Source using(StreamReader FileSrc = new StreamReader(strFileSrc)) { content = FileSrc.ReadToEnd(); FileSrc.Close(); }
Regex ex = new Regex(oldExpr); content = ex.Replace(content, newExpr);
// Check of the destination file if (args.Length > 3) strFileDest = args[3]; else strFileDest = strFileSrc; // Creation/replacement of the destination file. using (StreamWriter FileDest = new StreamWriter(strFileDest)) { FileDest.Write(content); FileDest.Close(); } } } }
|
En espérant que ça vous serve. Si vous avez des commentaires, n'hésitez pas.