Page 2 sur 2
Re: [R] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 22:11
par Boulanza
traitement un par un:
n1.ini
n2.ini
n3.ini
n4.ini
.
.
.
nn.ini
Re: [..] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 22:27
par mikell
?
Code : Tout sélectionner
$dir = "c:\Temp\ExportDrvpi\"
Local $hSearch = FileFindFirstFile($dir & "*.ini"), $res
While 1
$sFileName = FileFindNextFile($hSearch)
$txt = FileRead($dir & $sFileName)
$tilt = StringRegExp($txt, '\$MP=(\V+)', 3)
If IsArray($tilt) Then
$res = $tilt[0]
Exitloop
EndIf
Wend
FileClose($hSearch)
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Msgbox(0,"", $res)
EndIf
Re: [..] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 22:35
par jguinch
Mikell, je crois qu'il voulait faire du traitement fichier par fichier, pas une recherche

...
Edit :
\V+ ? Je t'avais jamais vu utilisé ça...

Re: [..] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 22:56
par mikell
Boulanza a écrit :Pour jguinch oui, effectivement je ne connais pas le nom du fichier, mais par contre je connais son emplacement dans le fichier temporaire :c:\Temp\ExportDrvpi\*.ini
J'en ai conclu qu'il cherchait une chaine dans un fichier ini de nom inconnu mais d'emplacement connu, mais vu la clarté de l'énoncé c'est vrai que je peux me tromper
\V+ j'utilise ça des fois comme "tout jusqu'à la fin de la ligne" (non- CR, LF, VT, FF)
Re: [..] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 23:09
par Boulanza
Oui mikell avec votre scripte on connait l'adresse exacte du fichier.ini bonne idée.
Celle de la doc l'est aussi pour un traitement en serie:
► Afficher le texte
#include <MsgBoxConstants.au3>
Example()
Func Example()
; Assign a Local variable the search handle of all files in the current directory.
Local $hSearch = FileFindFirstFile(@TempDir&"\ExportDrvpi\*.ini")
; Check if the search was successful, if not display a message and return False.
If $hSearch = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern.")
Return False
EndIf
; Assign a Local variable the empty string which will contain the files names found.
Local $sFileName = "", $iResult = 0
While 1
$sFileName = FileFindNextFile($hSearch)
; If there is no more file matching the search.
If @error Then ExitLoop
; Display the file name.
$iResult = MsgBox(BitOR($MB_SYSTEMMODAL, $MB_OKCANCEL), "", "File: " & $sFileName)
If $iResult <> $IDOK Then ExitLoop ; If the user clicks on the cancel/close button.
WEnd
; Close the search handle.
FileClose($hSearch)
EndFunc ;==>Example
Maintenant, ce qui reste à faire c'est d'intégrer cette application dans le script de scorp84 !
Re: [..] Copier une chaîne de caractère
Posté : mer. 23 avr. 2014 23:29
par jchd
mikell,
Tu as aussi \N* un poil plus proche de la spécification "tout jusqu'à la fin de la ligne".
Re: [R] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 10:37
par Boulanza
Bonjour,
L’avantage de ce forum AutoIt c’est que tout le monde y participe activement à la décision… Bravo…
Pour ne pas sortir de la question objet de cette aide, peut on améliorer le scripte de mikell ci-dessus pour un traitement fichier par fichier:
Script mikell
► Afficher le texte
$dir = "c:\Temp\ExportDrvpi\"
Local $hSearch = FileFindFirstFile($dir & "*.ini"), $res
While 1
$sFileName = FileFindNextFile($hSearch)
$txt = FileRead($dir & $sFileName)
$tilt = StringRegExp($txt, '\$MP=(\V+)', 3)
If IsArray($tilt) Then
$res = $tilt[0]
Exitloop
EndIf
Wend
FileClose($hSearch)
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Msgbox(0,"", $res)
EndIf
Puis intégrer cette solution "mikell" dans le script de scorp84 afin de permetre de copier une chaîne de caractère depuis le fichier « texte 1 » et la collet à la place d’une autre chaîne de caractère se trouvant dans un autre fichier « texte 2 ».
Script scorp84
► Afficher le texte
; Ouverture des fichiers
Local $file1 = FileOpen("test.txt", 0)
Local $file2 = FileOpen("test2.txt",2)
; Vérifie si fichier 1 OK
If $file1 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Vérifie si fichier 2 OK
If $file2 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Déclare contenu fichier 2
Dim $contenu2
; Lecture ligne à ligne du fichier 1
While 1
Local $line = FileReadLine($file1)
; SI EOF, sortie de la boucle
If @error = -1 Then ExitLoop
; Remplacement de chaîne
$line=StringReplace($line,"AAAA","ZZZZ")
; Ajout au contenu du fichier 2
$contenu2=$contenu2 & $line & @CRLF
WEnd
; Ecriture du fichier 2
FileWrite($file2,$contenu2)
; Fermeture des fichiers
FileClose($file1)
FileClose($file2)
Cordialement.
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 14:10
par Boulanza
Bonjour,
Je suis arrivé à intégrer les deux scriptes, mais j'ai un souci avec la fonction:
;Remplacement de chaîne
$line=StringReplace($line,"????",$chaine)
► Afficher le texte
Code : Tout sélectionner
#include <MsgBoxConstants.au3>
#include <Array.au3>
;=================================
$dir = @TempDir&"\ExportDrvpi\"
Local $hSearch = FileFindFirstFile($dir & "*.ini"), $res
;While 1
$sFileName = FileFindNextFile($hSearch)
$txt = FileRead($dir & $sFileName)
; Msgbox(0,"", $sFileName)
$tilt = StringRegExp($txt, '\$Key=(\V+)', 3)
If IsArray($tilt) Then
$res = $tilt[0]
;Exitloop
EndIf
; Wend
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Global $sFilePath=$sFileName
Msgbox(0,"$sFilePath", $sFilePath)
Global $Key=$res
Local $chaine = $res
MsgBox(0, "Chaine", $chaine)
Local $chaine = IniRead($sFilePath, "parametres", "$Key", "")
Msgbox(0,"trouvé", $res)
; Ouverture des fichiers
Local $file1 = FileOpen(@ScriptDir&"\test1.au3", 0)
Local $file2 = FileOpen($sFilePath,2)
; Vérifie si fichier 1 OK
If $file1 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Vérifie si fichier 2 OK
If $file2 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
EndIf
; Déclare contenu fichier 2
Dim $contenu2
; Lecture ligne à ligne du fichier 1
While 1
Local $line = FileReadLine($file1)
; SI EOF, sortie de la boucle
If @error = -1 Then ExitLoop
; Remplacement de chaîne
$line=StringReplace($line,"????",$chaine)
; Ajout au contenu du fichier 2
$contenu2=$contenu2 & $line & @CRLF
WEnd
; Ecriture du fichier 2
FileWrite($file2,$contenu2)
; Fermeture des fichiers
FileClose($file1)
FileClose($file2)
;==========================================
svp, pouvriez vous me guider à trouver mon erreur merci.
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 14:39
par mikell
Si le problème avait dès le début été clairement énoncé avec précision, il aurait été résolu en 3 ou 4 messages au lieu des 28 actuels ^^
Le mode 2 efface tout le contenu du fichier avant écriture, tu es sûr que c'est ce que tu veux ?
FileWrite
Write text/data to the end of a previously opened file.
ça serait pas plutôt ça ?
@jchd
C'est vrai mais j'ai découvert \N sur le tard dans ta nouvelle doc, après on a des habitudes tu sais ce que c'est... et franchement entre \V et \N la différence n'est pas outrageuse même si effectvt \N est approprié
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 15:00
par jchd
Mon intention n'est certainement pas de t'outrager !
Je constate au contraire que tu interviens de plus en plus -à bon escient et ici ou ailleurs- dans les fils mettant en oeuvre des expressions régulières, ce qui est tout à fait à ton honneur.
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 15:53
par Boulanza
je compte sur votre compréhension...
Mikell : Le mode 2 efface tout le contenu du fichier avant écriture, tu es sûr que c'est ce que tu veux ?
RE : Oui, il faut garder le mode 2
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 16:19
par mikell
@jchd
Boudu non, c'est juste que j'ai bien conscience d'être un newbie encore hésitant en matière d'expressions régulières, qui sont un labyrinthe dans lequel il vaut mieux naviguer avec une forte lampe, l'exemple cy-dessus en étant une parfaite illustration
Code : Tout sélectionner
. : Matches any single character except, by default, a newline sequence
\N : Matches any character except a newline sequence
\V : Matches any character that is not a vertical whitespace character. (ref: \v is equivalent to "[\x0A-\x0D]" by default)
Boulanza
► Afficher le texte
Code : Tout sélectionner
$dir = "c:\Temp\ExportDrvpi\"
Local $res = "" ; variable $res initialisée vide
Local $hSearch = FileFindFirstFile($dir & "*.ini") ; parcourt le répertoire
While 1
$sFileName = FileFindNextFile($hSearch) ; lit un fichier ini après l'autre
$txt = FileRead($dir & $sFileName)
$tilt = StringRegExp($txt, '\$MP=(\V+)', 3) ; cherche une chaine $MP="chaine"
If IsArray($tilt) Then
$res = $tilt[0] ; si chaine trouvée, $res = la chaine
Exitloop ; et on sort de la boucle
EndIf
Wend
FileClose($hSearch)
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Local $file2 = FileOpen("fichier2", 2) ; ouvre "fichier2" en écriture avec effacement du contenu
FileWrite($file2, $res) ; y écrit la chaine
FileClose($file2)
; Msgbox(0,"", $res)
EndIf
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 17:09
par Boulanza
Re-Bonjour mikell,
Je suis arrivé à intégrer votre premier script avec celui de scorp84, les deux scriptes répondent parfaitement à ma demande, mais j'ai un problème pour remplacer une chaîne de caractère. Voici la fonction qui ne marche pas dans le script ci-dessous:
;Remplacement de chaîne
$line=StringReplace($line,"????",$chaine)
► Afficher le texte
#include <MsgBoxConstants.au3>
#include <Array.au3>
#Include <File.au3>
;=================================
$dir = @TempDir&"\ExportDrvpi\"
Local $hSearch = FileFindFirstFile($dir & "*.ini"), $res
;While 1
$sFileName = FileFindNextFile($hSearch)
$txt = FileRead($dir & $sFileName)
; Msgbox(0,"", $sFileName)
$tilt = StringRegExp($txt, '\$Key=(\V+)', 3)
If IsArray($tilt) Then
$res = $tilt[0]
;Exitloop
EndIf
; Wend
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Global $sFilePath=$sFileName
Msgbox(0,"$sFilePath", $sFilePath)
Global $Key=$res
Local $chaine = $res
MsgBox(0, "Chaine", $chaine)
Local $chaine = IniRead($sFilePath, "parametres", "$Key", "")
Msgbox(0,"trouvé", $res)
; Ouverture des fichiers
Local $file1 = FileOpen(@ScriptDir&"\test1.au3", 0)
Local $file2 = FileOpen($sFilePath,2)
; Vérifie si fichier 1 OK
If $file1 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Vérifie si fichier 2 OK
If $file2 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
EndIf
; Déclare contenu fichier 2
Dim $contenu2
; Lecture ligne à ligne du fichier 1
While 1
Local $line = FileReadLine($file1)
; SI EOF, sortie de la boucle
If @error = -1 Then ExitLoop
; Remplacement de chaîne
$line=StringReplace($line,"????",$chaine)
; Ajout au contenu du fichier 2
$contenu2=$contenu2 & $line & @CRLF
WEnd
; Ecriture du fichier 2
FileWrite($file2,$contenu2)
; Fermeture des fichiers
FileClose($file1)
FileClose($file2)
Cordialement.
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 17:45
par mikell
ça peut-être ?
Code : Tout sélectionner
$txt1 = FileRead("fichier1") ; lit fichier1
$txt1 = StringReplace($txt1, "????", $chaine) ; remplace "????" par $chaine
Local $file2 = FileOpen("fichier2", 2) ; ouvre "fichier2" en écriture avec effacement du contenu
FileWrite($file2, $txt1) ; écrit le nouveau texte
FileClose($file2)
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 18:39
par Boulanza
Pour mikell
Oui, J'ai testé... ça donne un fichier .ini vide ! en plus lorsque je modifie la fonction Local $file2 = FileOpen("fichier2", 2) en mode 0: FileOpen("fichier2", 0) pas de remplacement de chaîne de caractère: "????" par $chaine pas de réaction de la part de la fonction : $txt1 = StringReplace($txt1, "????", $chaine). Peut être je n'ai pas su insérè votre modiication dans le script ! ci-joint:
► Afficher le texte
#include <MsgBoxConstants.au3>
#include <Array.au3>
#Include <File.au3>
;=================================
$dir = @TempDir&"\ExportDrvpi\"
Local $hSearch = FileFindFirstFile($dir & "*.ini"), $res
;While 1
$sFileName = FileFindNextFile($hSearch)
$txt = FileRead($dir & $sFileName)
; Msgbox(0,"", $sFileName)
$tilt = StringRegExp($txt, '\$Key=(\V+)', 3)
If IsArray($tilt) Then
$res = $tilt[0]
;Exitloop
EndIf
; Wend
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Global $sFilePath=$sFileName
Msgbox(0,"$sFilePath", $sFilePath)
Global $Key=$res
Local $chaine = $res
MsgBox(0, "Chaine", $chaine)
Local $chaine = IniRead($sFilePath, "parametres", "$Key", "")
Msgbox(0,"trouvé", $res)
; Ouverture des fichiers
Local $file1 = FileOpen(@ScriptDir&"\test1.au3", 0)
Local $file2 = FileOpen($sFilePath,2)
; Vérifie si fichier 1 OK
If $file1 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Vérifie si fichier 2 OK
If $file2 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
EndIf
; Déclare contenu fichier 2
Dim $contenu2
; Lecture ligne à ligne du fichier 1
While 1
Local $line = FileReadLine($file1)
; SI EOF, sortie de la boucle
If @error = -1 Then ExitLoop
; Remplacement de chaîne
$line=StringReplace($line,"????",$chaine)
; Ajout au contenu du fichier 2
$contenu2=$contenu2 & $line & @CRLF
WEnd
; Ecriture du fichier 2
FileWrite($file2,$contenu2)
; Fermeture des fichiers
FileClose($file1)
FileClose($file2)
Re: [..] Copier une chaîne de caractère
Posté : jeu. 24 avr. 2014 23:22
par mikell
Bon on résume
Avec un fichier ini comme ça
► Afficher le texte
[parametres]
Nom et prénom=Boulanza
E-mail=
Boulanza@gmail.com
Numéro de téléphone=xxxxxxxxxxxxxxxx
Commande du=23 04 2014 à 08H08M00S541F
$MP=0x1B659738372809B64FF43AE1C030EA4CBE1A95E5
tralala=tsointsoin
le code suivant
► Afficher le texte
Code : Tout sélectionner
$dir = @scriptdir & "\"
Local $res = "" ; variable $res initialisée vide
Local $hSearch = FileFindFirstFile($dir & "*.ini") ; parcourt le répertoire
While 1
$sFileName = FileFindNextFile($hSearch) ; lit un fichier ini après l'autre
$txt = FileRead($dir & $sFileName)
$tilt = StringRegExp($txt, '\$MP=(\V+)', 3) ; cherche une chaine $MP="chaine"
If IsArray($tilt) Then
$res = $tilt[0] ; si chaine trouvée, $res = la chaine
Exitloop ; et on sort de la boucle
EndIf
Wend
FileClose($hSearch)
If $res = "" Then
Msgbox(0,"", "pas trouvé")
Else
Msgbox(0,"", $res) ; <====== jusque là ça marche
; $txt1 = FileRead("fichier1")
; $txt1 = StringReplace($txt1, "????", $res) ; fait le remplacement
; Local $file2 = FileOpen("fichier2", 2) ; ouvre "fichier2" en écriture avec effacement du contenu
; FileWrite($file2, $txt1) ; y écrit le nouveau texte
; FileClose($file2)
EndIf
retourne bien dans la msgbox la chaine recherchée
J'ai testé le code ci-dessus avec des fichiers txt et il fait parfaitement tout ce que tu demandes
Donc
Pour la partie 'copie' (commentée dans le script) tu as dû faire quelque part une erreur de syntaxe
Alors
Vérifie bien les chemins des fichiers, et sous chaque ligne de la partie 'copie' du script mets une msgbox de debug, comme ça tu trouveras où ça merdoie
Re: [R] Copier une chaîne de caractère
Posté : ven. 25 avr. 2014 19:07
par Boulanza
Bonsoir mikell,
Merci à toi et à tous les intervenants qui m'ont aidé à monter ce script, c'est grasse à vos aides que j'ai enfin pu trouver la solution parfaite, objet de ma demande.
Code : Tout sélectionner
#NoTrayIcon
#RequireAdmin
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#Include <File.au3>
;=================================
Global $dir = @TempDir&"\ExportDrvpi\"
Global $hSearch = FileFindFirstFile($dir & "*.ini"), $res
While 1
$sFileName = FileFindNextFile($hSearch) ; lit un fichier ini après l'autre
$txt = FileRead($dir & $sFileName)
Msgbox(0,"$sFilePath", $sFileName)
$tilt = StringRegExp($txt, '\$Key=(\V+)', 3) ; cherche une chaine $MP="chaine"
If IsArray($tilt) Then
$res = $tilt[0] ; si chaine trouvée, $res = la chaine
Exitloop ; et on sort de la boucle
EndIf
Wend
;==========================
Global $sFilePath=$sFileName
;Msgbox(0,"$sFilePath", $sFilePath)
Global $Key=$res
Global $chaine = $res
MsgBox(0, "Chaine", $chaine)
Global $chaine = IniRead($sFilePath, "parametres", "$Key", "")
;Msgbox(0,"trouvé", $res)
; Ouverture des fichiers
Global $file1 = FileOpen(@ScriptDir&"\test1.au3", 0)
Global $file2 = FileOpen($sFilePath,2)
Msgbox(0,"trouvé", $file2)
;Vérifie si fichier 1 OK
If $file1 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Vérifie si fichier 2 OK
If $file2 = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
; Déclare contenu fichier 2
Dim $contenu2
; Lecture ligne à ligne du fichier 1
While 1
Local $line = FileReadLine($file1)
; SI EOF, sortie de la boucle
If @error = -1 Then ExitLoop
; Remplacement de chaîne
$line=StringReplace($line,"????",$res)
; Ajout au contenu du fichier 2
$contenu2=$contenu2 & $line & @CRLF
WEnd
; Ecriture du fichier 2
FileWrite($file2,$contenu2)
; Fermeture des fichiers
FileClose($file1)
FileClose($file2)
; Si le remplacement ne s'est pas effectué, on supprimer le fichier backup.
;Msgbox(0,"$sFileName", $sFileName)
FileDelete($dir&$sFileName)
Cordialement.
Re: [R] Copier une chaîne de caractère
Posté : ven. 25 avr. 2014 22:00
par jguinch
Boulanza, essaye de penser à la balise
Re: [R] Copier une chaîne de caractère
Posté : sam. 26 avr. 2014 22:12
par Boulanza
Bonsoir jguinch,
Merci pour la remarque. C'est fait.
Cordialement.