Page 1 sur 1

Espaces indésirables entre les lignes d'un texte

Posté : ven. 11 nov. 2016 18:37
par NowisV
Bonjour à tous.
Je suis nouvel utilisateur de AutoIt et Scite et je découvre les formidables possibilités de ces outils.
Cependant je souhaite réaliser une chose extrêmement simple qui fonctionne bien mais qui me rend fou à cause d'un petit soucis.
L'idée est de récupérer le contenue d'un fichier texte ".txt" et l'envoyer avec la fonction Send() vers un autre fichier ".txt" qui est ouvert.
Mon code fonctionne parfaitement mais le texte que je récupère se voit affublé de plusieurs sauts de lignes...
Par exemple, si mon fichier source ressemble à ça:
"Je suis un texte test,
je suis écrit sur plusieurs lignes.
Ceci est ma troisième et dernière ligne."

Je vais récupérer dans mon fichier cible quelque chose comme ça:
"Je suis un texte test,

je suis écrit sur plusieurs lignes.

Ceci est ma troisième et dernière ligne."

Voir même parfois avec plusieurs lignes vides entre chaque lignes de texte.
Si quelqu'un à une idée de comment procéder pour éviter ça...?
Désolé si le sujet a déjà était traité, c'est que je suis surement passer à côté.

Mon code:
► Afficher le texte

Re: Espaces indésirables entre les lignes d'un texte

Posté : ven. 11 nov. 2016 20:08
par jchd
Le presse-papier ne serait-il pas plus simple (et un tout petit peu plus fiable) ?

Re: Espaces indésirables entre les lignes d'un texte

Posté : ven. 11 nov. 2016 22:29
par orax
Ou même ControlSend() pour ne pas être obligé d'activer la fenêtre (WinActivate devient facultatif). Mais, à mon avis, il faudrait surtout ajouter $SEND_RAW pour que Send et ControlSend n'interprètent pas le texte. L'ajout de $SEND_RAW permet de supprimer les StringReplace puisqu'ils ne sont plus nécessaires.
#include <AutoItConstants.au3>

Func Lire()
   Local Const $filePath = 'J:\Temp\MonFichierTemp.txt'
   Local $tempFile = FileOpen($filePath, $FO_READ)
   If $tempFile = -1 Then
      Exit
   EndIf
   Local $fileRead = FileRead($tempFile)
   FileClose($tempFile)
   Return $fileRead
EndFunc   ;==>Lire

$file = "monTexteCible.txt" & Chr(0xA0) & "- Bloc-notes"
$Texte = Lire()
If WinExists($file) Then
;~    WinActivate($file) ; pas nécessaire avec ControlSend
;~    Send($Texte, $SEND_RAW)
   ControlSend($file,"","Edit1",$Texte, $SEND_RAW)
Else
   Exit
EndIf

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 12 nov. 2016 15:11
par NowisV
jchd a écrit :Le presse-papier ne serait-il pas plus simple (et un tout petit peu plus fiable) ?
Vous avez peut-être raison mais là on touche à quelque chose qui m'est totalement inconnu.
Si vous avez des précisions à ce sujet, je suis preneur pour explorer toutes les pistes. Merci

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 12 nov. 2016 15:40
par NowisV
orax a écrit :Ou même ControlSend() pour ne pas être obligé d'activer la fenêtre (WinActivate devient facultatif). Mais, à mon avis, il faudrait surtout ajouter $SEND_RAW pour que Send et ControlSend n'interprètent pas le texte. L'ajout de $SEND_RAW permet de supprimer les StringReplace puisqu'ils ne sont plus nécessaires.
Merci @orax pour ces astuces, particulièrement pour le fait de ne pas avoir a activer la fenêtre grâce au ControlSend()!
ça ne va pas me servir ici mais pour une autre fonction où justement cela était problématique.

Par contre, concernant mes soucis d'espaces (lignes vides) entre mes lignes de textes, rien de neuf...
Le ControlSend() ne contourne pas ce problème :?
J'ai essayé avec un controlID $SEND_DEFAULT, (pour voir comment la chose se comporte), certe, les caractères spéciaux ne passent pas en l'état, mais si le dernier caractère de ma ligne de texte est un !, je récupère bien mon texte sans interlignes vides...
Je me dis que le problème doit forcément venir de l’interprétation du texte faite par AutoIt mais de ce fait, je n'en suis que d'avantage pommé.

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 12 nov. 2016 22:49
par mikell
Est-il vraiment indispensable de passer par le bloc-notes pour copier le texte du fichier source vers le fichier cible ?
Zapper le bloc-notes serait teeeeellement plus fiable (et plus simple) :roll:

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 12 nov. 2016 23:14
par orax
Le chat a raison.

Un autre code à tester :
#include <AutoItConstants.au3>

Func Lire()
   Local Const $filePath = 'J:\Temp\MonFichierTemp.txt'
   Local $tempFile = FileOpen($filePath, $FO_READ)
   If $tempFile = -1 Then
      Exit
   EndIf
   Local $fileRead = FileRead($tempFile)
   FileClose($tempFile)
   Return $fileRead
EndFunc   ;==>Lire

$file = "monTexteCible.txt" & Chr(0xA0) & "- Bloc-notes"
$Texte = Lire()
If WinExists($file) Then
    ;----------
   WinActivate($file)
   ClipPut($Texte) ; met $Texte dans le presse-papier
   Send("^v") ; CTRL+v
    ;----------
    ; ou, autre solution :
;~     ControlSetText($file,"","Edit1", $Texte) ; <= décommenter cette ligne pour tester
    ;----------
Else
   Exit
EndIf

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 12 nov. 2016 23:19
par walkson
Et comme ça, c'est pas plus simple ?
$data = FileRead(@ScriptDir & "\Doc Text\xcopy.txt")
$open = FileOpen(@ScriptDir & "\texte.txt",1)
FileRead($open)
FileWrite($open,@CRLF & $data)
FileClose($open)
:mrgreen:

Je rajoute une petite explication pour NowisV:
J'ouvre le txt cible en lecture écriture ($open)
je lis le contenu, ce qui me situe à la fin du texte
j'écrits les données sources ($data)

Re: Espaces indésirables entre les lignes d'un texte

Posté : dim. 13 nov. 2016 14:08
par mikell
@walkson
FileRead($open) me semble superflu ^^

Re: Espaces indésirables entre les lignes d'un texte

Posté : dim. 13 nov. 2016 23:18
par franco
Bonsoir :)
NowisV a écrit :L'idée est de récupérer le contenue d'un fichier texte ".txt" et l'envoyer avec la fonction Send() vers un autre fichier ".txt" qui est ouvert.
jchd a écrit :Le presse-papier ne serait-il pas plus simple (et un tout petit peu plus fiable) ?
j'approuve à 100%

Personnellement, pour récupérer le contenu d'un fichier, je le déclare tout d'abord dans une variable, et je copie le contenu de la variable déclarée dans le presse papier.

Comme ceci :
#include <File.au3>
$fichier = "fichier.txt"
$line = ""
For $a = 1 To _FileCountLines($fichier)
   $line &= FileReadLine($fichier, $a) & @CRLF
Next
ClipPut($line)



Je peux (probablement) être à coté de la plaque. ;)


++

Re: Espaces indésirables entre les lignes d'un texte

Posté : dim. 13 nov. 2016 23:31
par orax
Si l'on ne souhaite pas modifier ou filtrer le contenu qui est récupérer, ClipPut(FileRead($fichier)) suffirait dans ce cas précis.

Re: Espaces indésirables entre les lignes d'un texte

Posté : lun. 14 nov. 2016 10:28
par NowisV
Bonjour et merci à tous pour vos réponses et votre réactivité.
Je pense que ce message va clore le sujet puisque le problème est résolu!
Pour aller au bout des choses, je vais tout de même répondre au cas par cas, comme ça, si quelqu'un comme moi passe par ce forum à cause d'un même soucis, il ou elle aura toutes les clés en main.
mikell a écrit :Est-il vraiment indispensable de passer par le bloc-notes pour copier le texte du fichier source vers le fichier cible ?
Zapper le bloc-notes serait teeeeellement plus fiable (et plus simple) :roll:
Oui, dans mon cas c'est indispensable de passer par le bloc-notes, car en réalité mes scripts AutoIt ne sont que des fichiers temporaires créés par un script .jsx en JavaScript pour After Effects qui va les exécuter selon les contrôles de mon UI dans After.
Hors, je suis obligé de stoker temporairement les informations qui viennent d'After Effects dans un fichier notepad pour que mes scripts AutoIt ne communiquent qu'avec lui.

De ce fait, j'ai également besoin que le fichier texte cible soit ouvert puisqu'il représente la clé de voute de mon script principale et il faut
que je puisse y travailler "en temps réel", du coup, je n'ai pas testé, mais...
walkson a écrit :Et comme ça, c'est pas plus simple ?

$data = FileRead(@ScriptDir & "\Doc Text\xcopy.txt")
$open = FileOpen(@ScriptDir & "\texte.txt",1)
FileRead($open)
FileWrite($open,@CRLF & $data)
FileClose($open)

Je rajoute une petite explication pour NowisV:
J'ouvre le txt cible en lecture écriture ($open)
je lis le contenu, ce qui me situe à la fin du texte
j'écrits les données sources ($data)
... si la fonction FileWrite() fonctionne sur le même principe que le file.write() du JavaScript, alors elle ne permet pas d'écrire en interagissant directement avec la fenêtre du fichier texte. J'ai donc exclu cette solution.

Bref, venons en aux faits, ceux de la résolution du problème!
( Et la médaille va à orax! )
En effet, que j'utilise la méthode ClipPut() et Send("^v") ou la méthode ControlSetText(), cela fonctionne parfaitement en plus de respecter tous
les caractères spéciaux!
Ce qui était primordial dans mon cas!

Donc, mon code corrigé:
#include <AutoItConstants.au3>
Func Lire()
Local Const $filePath = 'J:\Temp\dossierTemporaire\MonFichierTemp.txt' ;chemin du fichier temporaire renvoyé par le script After Effects
Local $tempFile = FileOpen($filePath,$FO_READ) ;j'ouvre le fichier en mode lecture
If $tempFile = -1 Then
Exit ; si le fichier n'existe pas, j’interromps le script pour ne pas avoir d'erreur
EndIf
Local $fileRead = FileRead($tempFile); je stock le contenu de mon fichier temporaire dans une variable*
FileClose($tempFile) ;je ferme mon fichier temporaire
Return $fileRead ;j'indique à ma fonction de renvoyer cette variable* lorsque j'appelle cette fonction
EndFunc ;fin de ma fonction Lire()
$file = "monFichierCible"&Chr(0xA0)&"- Bloc-notes" ;le fichier qui va récupérer le contenu de mon fichier temp
$Texte = Lire() ;j'appelle ma fonction en la déclarant dans une variable pour attribuer à celle ci la valeur que renvoie la fonction
If WinExists($file) Then ;si la fenêtre de mon fichier cible existe...
WinActivate($file) ;... je l'active...
ControlSetText($file,"","Edit1", $Texte) ;... et je lui envoie le contenu de mon fichier temp
Else ;si non (si la fenêtre de mon fichier cible n'existe pas)...
Exit ;... j’interromps le script
EndIf
Voilà !
Donc tout fonctionne bien avec tout ça, dommage seulement que le ControlSetText() ne déplace pas le curseur d’édition à la fin du texte
comme le fait le Send(), mais bon... là je titille la baleine avec un hameçon :wink:
Encore merci à tous!

Re: Espaces indésirables entre les lignes d'un texte  

Posté : lun. 14 nov. 2016 17:36
par ZDS
Bonjour NowisV,

Pas sûr que cela te suffise, mais avec la fonction SendMessage et le paramètre $EM_SETSEL, tu peux sélectionner du texte, et donc placer ton curseur de texte à un endroit voulu (je n'ai pas l'environnement pour tester ce que je viens de t'envoyer, donc désolé si le code demande une ou deux retouches) :
#include <AutoItConstants.au3>
#include <SendMessage.au3>

Func Lire()
   Local Const $filePath = 'J:\Temp\dossierTemporaire\MonFichierTemp.txt' ;chemin du fichier temporaire renvoyé par le script After Effects
   Local $tempFile = FileOpen($filePath,$FO_READ) ;j'ouvre le fichier en mode lecture
   If $tempFile = -1 Then Exit ; si le fichier n'existe pas, j’interromps le script pour ne pas avoir d'erreur
   Local $fileRead = FileRead($tempFile); je stock le contenu de mon fichier temporaire dans une variable*
   FileClose($tempFile) ;je ferme mon fichier temporaire
   Return $fileRead ;j'indique à ma fonction de renvoyer cette variable* lorsque j'appelle cette fonction
EndFunc ;fin de ma fonction Lire()

$file = "monFichierCible"&Chr(0xA0)&"- Bloc-notes" ;le fichier qui va récupérer le contenu de mon fichier temp
$Texte = Lire() ;j'appelle ma fonction en la déclarant dans une variable pour attribuer à celle ci la valeur que renvoie la fonction
If WinExists($file) Then ;si la fenêtre de mon fichier cible existe...
   WinActivate($file) ;... je l'active...
   ControlSetText($file,"","Edit1", $Texte) ;... et je lui envoie le contenu de mon fichier temp
   Local $handle = ControlGetHandle($file, "", "Edit1"), $n = StringLen($Texte) ; Je récupère l'identifiant du controle que je viens de modifier, ainsi que la taille du texte
   _SendMessage($handle, 0xB1, $n, $n) ; $EM_SETSEL = 0xB1 ; Je sélectionne de la fin à la fin, autrement dit je place mon curseur à la fin du texte
Else ;si non (si la fenêtre de mon fichier cible n'existe pas)...
   Exit ;... j’interromps le script
EndIf
A bientôt !

Re: Espaces indésirables entre les lignes d'un texte

Posté : sam. 19 nov. 2016 12:36
par NowisV
Merci ZDS,

Ça fonctionne au poil :)

Maintenant on peut dire que mon problème est définitivement résolu !

Encore merci à tous. Je vous souhaite plein de bonnes choses!