Espaces indésirables entre les lignes d'un texte

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
NowisV
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 11 nov. 2016 18:02
Status : Hors ligne

Espaces indésirables entre les lignes d'un texte

#1

Message 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
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#2

Message par jchd »

Le presse-papier ne serait-il pas plus simple (et un tout petit peu plus fiable) ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#3

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
NowisV
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 11 nov. 2016 18:02
Status : Hors ligne

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

#4

Message 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
NowisV
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 11 nov. 2016 18:02
Status : Hors ligne

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

#5

Message 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é.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#6

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#7

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#8

Message 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)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#9

Message par mikell »

@walkson
FileRead($open) me semble superflu ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

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

#10

Message 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. ;)


++
L'entraide, c'est mon dada ;)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#11

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
NowisV
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 11 nov. 2016 18:02
Status : Hors ligne

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

#12

Message 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!
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

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

#13

Message 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 !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
NowisV
Niveau 1
Niveau 1
Messages : 5
Enregistré le : ven. 11 nov. 2016 18:02
Status : Hors ligne

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

#14

Message 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!
Répondre