Rechercher et remplacer les opérations mathématiques par le résultat dans Notepad ++

J'ai plusieurs grands fichiers txt les exemples suivants:

data="32/3" count id="3" data="0.0237/4" ext min="1" max="3" data="28.69*2" 

Mon objectif est de rechercher toutes les opérations mathématiques et de les remplacer par ses résultats, comme ceci:

 data="10.666667" count id="3" data="0.005925" ext min="1" max="3" data="57.38" 

Existe-t-il un moyen d'automatiser cela dans Notepad ++?

Vous pouvez l'automatiser dans Notepad ++ en créant un raccourci vers VBScript externe. Voici le script:

 Option Explicit Const FileEncoding = 0 ' 0 = ASCII, -1 = Unicode, -2 = System Default Const FractDigits = 6 ' number of fractional digits Dim objList, strPath If WScript.Arguments.Count = 0 then CreateObject("WScript.Shell").PopUp "Drop folder(s) and / or file(s) to the script to process", 3, , 48 WScript.Quit End If Set objList = ReadContent(WScript.Arguments) If objList.Count = 0 Then CreateObject("WScript.Shell").PopUp "No files found", 3, , 48 WScript.Quit End If With CreateObject("VBScript.RegExp") .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(\w+=)""([\.\d\(\)\\\*\+/-]*)""" For Each strPath In objList WriteToFile .Replace(objList(strPath), GetRef("FnReplace")), strPath, FileEncoding Next End With CreateObject("WScript.Shell").PopUp "Completed", 1, , 64 Function FnReplace(strMatch, strSubMatch1, strSubMatch2, lngPos, strSource) Dim strResult On Error Resume Next strResult = CStr(Round(Eval(strSubMatch2), FractDigits)) If Err Then Err.Clear FnReplace = strMatch Else FnReplace = strSubMatch1 & """" & strResult & """" End If End Function Function ReadContent(arrList) Dim objList, strPath Set objList = CreateObject("Scripting.Dictionary") For Each strPath In arrList AddContent strPath, objList Next Set ReadContent = objList End Function Sub AddContent(strPath, objList) Dim objItem With CreateObject("Scripting.FileSystemObject") If .FileExists(strPath) Then objList(strPath) = ReadFromFile(strPath, FileEncoding) End If If .FolderExists(strPath) Then For Each objItem In .GetFolder(strPath).Files AddContent objItem.Path, objList Next For Each objItem In .GetFolder(strPath).SubFolders AddContent objItem.Path, objList Next End If End With End Sub Function ReadFromFile(strPath, intFormat) With CreateObject("Scripting.FileSystemObject").OpenTextFile(strPath, 1, False, intFormat) ReadFromFile = "" If Not .AtEndOfStream Then ReadFromFile = .ReadAll .Close End With End Function Sub WriteToFile(strCont, strPath, intFormat) With CreateObject("Scripting.FileSystemObject").OpenTextFile(strPath, 2, True, intFormat) .Write(strCont) .Close End With End Sub 

Procédez comme suit:

  • Enregistrez ce script dans un fichier, par exemple C: \ Test \ MathResults.vbs
  • Ouvrez votre fichier texte dans Notepad ++
  • Cliquez sur Menu – Exécuter (ou F5 )
  • Entrez "C:\Test\MathResults.vbs" "$(FULL_CURRENT_PATH)" incluant des citations dans le champ Programme à exécuter
    Spécifiez le chemin
  • Cliquez sur Enregistrer ...
  • Créer un raccourci, saisir par exemple MathResults comme nom et Ctrl + F7 comme raccourci clavier
    Choisissez les touches de raccourci
  • Cliquez sur OK
  • Cliquez sur Exécuter

Maintenant, votre raccourci a été enregistré dans le fichier de configuration, vous pouvez simplement ouvrir des fichiers texte, appuyez sur Ctrl + F7 , une fois le script terminé, la boîte de dialogue de rechargement s'affiche, cliquez sur Oui pour afficher le fichier modifié. C'est tout.

BTW, ce script fonctionne parfaitement parfaitement, vous pouvez sélectionner dans la fenêtre de l'explorateur ou sur le numéro de bureau des fichiers et dossiers à traiter, puis le déposer dans le fichier de script.

Pas possible avec les techniques de Notepad ++. Mais vous pouvez utiliser Powershell pour faire le travail et l'utiliser à partir de Notepad ++

Avant après

Entrez la description de l'image ici Entrez la description de l'image ici

EvaluateFormulas.ps1

 $Content = Get-Content -Path $Args[0] $Formulas = ($Content | Select-String -Pattern '(?<=data=").*?(?=")' -AllMatches).Matches ForEach ($Formula in $Formulas){ $Result = Invoke-Expression -Command $Formula.Value $Result = [Math]::Round($Result,6) $Content = $Content -Replace [Regex]::Escape($Formula), $Result } Set-Content -Path $Args[0] -Value $Content 

Explication

  • Le motif Regex (?<=data=").*?(?=") Utilise un look-ahead et un look-behind pour capturer tout entre data=" and the next " . De cette façon, vous obtenez les chaînes 32/3, 0.0237 / 4 et 28.69 * 2 pour votre exemple
  • Ensuite, nous utilisons Invoke-Expression pour calculer les résultats mathématiques de ces chaînes. Vous obtenez 10.6666666666667, 0.005925 et 57.38
  • Un rapide Math::Round(x,6) ronde les résultats à 6 chiffres fractionnaires si nécessaire
  • Maintenant, nous utilisons une recherche regex et remplacez-la pour rechercher la chaîne de formule actuelle sur l'ensemble du fichier (rappelez-vous, nous sommes en boucle) et remplacez-le par notre résultat calculé
  • La dernière étape consiste à écrire le contenu modifié dans n'importe quel fichier de sortie souhaité

Rien de spécial. La partie la plus difficile était de savoir comment remplacer les caractères spéciaux ( * est tel). Voici [regex]::Escape() à la rescousse.


Le script peut être utilisé à partir de Notepad ++ de la même manière que @omegastripes a déjà décrit.

  1. Dans Notepad ++, appuyez sur F5 et entrez:

     Powershell -File "C:\your\path\to\EvaluateFormulas.ps1" "$(FULL_CURRENT_PATH)" 
  2. Cliquez sur Enregistrer et définissez un raccourci

Mises en garde

Dans l'état actuel, toutes les modifications sont enregistrées dans le fichier immédiatement. Faire une sauvegarde avant de l'exécuter