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:
"C:\Test\MathResults.vbs" "$(FULL_CURRENT_PATH)"
incluant des citations dans le champ Programme à 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 ++
$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
(?<=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 Invoke-Expression
pour calculer les résultats mathématiques de ces chaînes. Vous obtenez 10.6666666666667, 0.005925 et 57.38 Math::Round(x,6)
ronde les résultats à 6 chiffres fractionnaires si nécessaire 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.
Dans Notepad ++, appuyez sur F5 et entrez:
Powershell -File "C:\your\path\to\EvaluateFormulas.ps1" "$(FULL_CURRENT_PATH)"
Cliquez sur Enregistrer et définissez un raccourci
Dans l'état actuel, toutes les modifications sont enregistrées dans le fichier immédiatement. Faire une sauvegarde avant de l'exécuter