Autoit [Résolu][Demande & Aide]Délimiter une recherche dans un .txt

Inscrit
24 Février 2012
Messages
55
Reactions
0
#1
Bonjours, suite à ma fonction "Trajet" fonctionnel, je me suis dis pourquoi pas rajouter quelque chose.
Mon exemple est pour D.
Si mon personnage est full pods, il va en banque puis il retourne à la 1er maps et recommence à faire son action (ici sa sera "Récolte".)
Ce qui donne en .txt :
Code:
Banque
[5,-24] bas
[5,-23] bas
[5,-22] bas
[5,-21] bas
[5,-20] bas
[5,-19] bas
[5,-18] bas
[5,-17] bas
[5,-16] gauche

Retours 
[4,-16] droite
[5,-16] haut
[5,-16] haut
[5,-17] haut
[5,-18] haut
[5,-19] haut
[5,-20] haut
[5,-21] haut
[5,-22] haut
[5,-23] haut

Recolte
[5,-24] droite
[5,-24] haut
[5,-24] gauche
[5,-24] bas

Donc je voudrais délimiter une recherche. (juste délimiter).

On peut lire que de "Banque" à "Retours" (On délimite ici l'aller à la banque.)
Code:
(on commence à lire ici)[5,-24] bas
[5,-23] bas
[5,-22] bas
[5,-21] bas
[5,-20] bas
[5,-19] bas
[5,-18] bas
[5,-17] bas
[5,-16] gauche(on fini de lire ici)
Au quel j'ajouterai ma lecture de cordonnée qui lirait que entre les crochets et lirait aussi la destination pour que mon changeur de maps change de maps.
Et Ainsi de suite pour le retours à la 1er maps.

J'avais penser à FileReadLine($StartTo, $EndTo) dans lequel je dis que $StartTo = $StringInStr($ligne, "Banque" & @CRLF) et $EndTo = ... ($ligne, "Retours")

Si quelqu'un a une idée pour délimiter le champs de lecture, une piste ... n'importe quoi, sa m'aiderait.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Salut , http://www.autoitscript.fr/forum/viewto ... =3&p=10821
tu lis ligne a ligne jusque trouver "banque" et ensuite tu lis lignes a ligne jusque trouver "".

tu peux eviter les bas , gauche , haut et droite :
pour haut et bas on regarde Y
[5,-24]
[5,-23]
-24 - -23 = -1 = bas

[5,-16]
[5,-17]
-16 - -17 = 1 = haut

pour gauche et droite on regarde X (meme methode)
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#3
Re: [Demande & Aide] Délimiter une recherche dans un .txt

ToOnS, Merci bien de ta réponse, Je vais lire tout sa et voir ce que je peux en tirer.

Pour ma part,
J'utilise case "direction"
-->Droite
$Map[0] += 1
Clique sur [Cases]

-->Gauche
$Map[0] -= 1
Clique sur [Cases]

-->Haut
$Map[1] += 1
Clique sur [Cases]

-->Bas
$Map[1] -= 1
Clique sur [Cases]

Selon la direction.
Et si $Pos = $Map (Si la prochaine map trouvée dans le .txt et égale à l'ancienne avec "x" += 1 (ou j'ajoute ou enlève 1 à x ou à y) alors clique sur la case pré-défini.
$Pos étant les cordonnées lus dans le .txt.
 
A

Anonymous

Invité
#4
Re: [Demande & Aide] Délimiter une recherche dans un .txt

En cherchant dans mes archive j'ai pu retrouvé cette fonction que j'avais faites '^^

inutile de lire dans un fichier texte chaque action à effectuer ... un simple algo permet de retrouvé le chemin à fournir !

voici un exemple;

Code:
#Include <Array.au3>

Local $atelierPaysan = "7,-25"
Local $passageTmp = "5,-22" ; pour aller a la banque on doit passer par 5,-22 (Astrub)
Local $banque =  "4,-16"
Local $posDeb,$posFin
$posDeb = StringSplit($atelierPaysan,",",3) ; je split. En $posDeb[0] = 7 | $posDeb[1]= -25
$posFin = StringSplit($passageTmp,",",3)

Local $array = mapChanger($posDeb,$posFin) ; on arrive en 5,-22
_ArrayDisplay($array)
$posDeb = $posFin
$posFin = StringSplit($banque,",",3) ; banque
Local $array2 = mapChanger($posDeb,$posFin)
_ArrayDisplay($array2)

Func mapChanger($posDeb,$posFin)
	Local $doX = ""
	Local $doY = ""
	$posDeb[0]= Number($posDeb[0])
	$posDeb[1]= Number($posDeb[1])
	$posFin[0]= Number($posFin[0])
	$posFin[1]= Number($posFin[1])
	While ( ($posDeb[0] <> $posFin[0] ) Or ($posDeb[1] <> $posFin[1]) )
		if($posDeb[0] < $posFin[0]) Then
			$doX&="D|"
			$posDeb[0]+=1
		Elseif ($posDeb[0] > $posFin[0]) Then
			$doX&="G|"
			$posDeb[0]-=1
		EndIf
		if($posDeb[1] < $posFin[1]) Then
			$doY&="B|"
			$posDeb[1]+=1
		Elseif ($posDeb[1] > $posFin[1]) Then
			$doY&="H|"
			$posDeb[1]-=1
		EndIf
	WEnd
	$doX = StringTrimRight($doX,1)
	$doY = StringTrimRight($doY,1)
	Local $toSplit = ""
	If $doX <> "" Then
		$toSplit&=$doX
		If $doY <> "" Then $toSplit&="|"&$doY
	Else
		If $doY <> "" Then $toSplit&=$doY
	EndIf
	Return StringSplit($toSplit,"|",3)
EndFunc
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#5
Re: [Demande & Aide] Délimiter une recherche dans un .txt

:o Pandi_Panda, vous venez de me donner ce que j'allais programmer xD
À la base, je me lançais dans la lecture d'un .txt pour ensuite crée un algorithme comme le votre.
J'en avait parlé à NicoMasterChief.

Votre algorithme est complet mais je demandais pas vraiment sa.
J'ai envie de faire des petites choses avant d'en faire des grandes voir de très grandes.
Je voulais commencer par :
Gérer un trajet à l'aide d'un .txt
Puis gérer la banque à l'aide d'un algorithme auquel j'associe un .txt avec zone récolte, banque (cordonnée x et y) et il ferait le calcul d'aller et retours.
En tout cas, je peux voir que vous avez rajouter la map intermédiaire par la quel il doit passer obligatoirement avant de pouvoirs rejoindre la banque.
 
A

Anonymous

Invité
#6
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Ha, bha désolé '^^

sinon si vous voulez gerer via un "fichier .txt", le plus simple aurait sans doute de se dirigé vers un fihier .ini ... de ce format ci? (plus évolué pour vous ^^)

[MapChanger]
bas=4
gauche=2
droite=1
haut=3
Code:
IniWrite(@ScriptDir&'\test.ini',"MapChanger","bas",4)
IniWrite(@ScriptDir&'\test.ini',"MapChanger","gauche",2)
IniWrite(@ScriptDir&'\test.ini',"MapChanger","droite",1)
IniWrite(@ScriptDir&'\test.ini',"MapChanger","haut",3)

MsgBox(0,"","B="&IniRead(@ScriptDir&'\test.ini',"MapChanger","bas",0)& _
@CRLF&"G="&IniRead(@ScriptDir&'\test.ini',"MapChanger","gauche",0)& _
@CRLF&"D="&IniRead(@ScriptDir&'\test.ini',"MapChanger","droite",0)& _
@CRLF&"H="&IniRead(@ScriptDir&'\test.ini',"MapChanger","haut",0))
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#7
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Pandi_Panda, Merci bien mais j'ai mon propre système de changement de maps. Si on lui met un script avec des erreurs
exemple :
[4,-24] droite
[1,-24] droite
il renvoie une erreur.

Je veux juste apprendre à lire un endroit donné dans un fichier .txt selon la condition (Banque, retours ou récolte). Sans sa il lira de haut en bas en boucle et fera les actions décrites.
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#8
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Pandi_Panda t'as mis sur la bonne piste.
Le meilleur moyen de pouvoir lire des sections est d'utiliser les fichiers .ini.
En AutoIt, tu as des fonctions programmées pour ce que tu cherches à faire.

Va voir du côté de IniRead, IniReadSection, et IniReadSectionNames. Tu verras, c'est beaucoup plus simple :).
Mais du coup, je pense que les crochets qui entourent les maps feront "buguer" le script.

@Pandi_Panda, ton algo peut être fun, mais je pense pas que ça soit pratique pour ajouter des trajets. Enfin, je pense.
Pour moi, le mieux est quand même le fichier txt.

Ca, ou bien dire "tu vas de la position A,B jusqu'à la position X,Y, là il calcule le nombre de cases d'écart, etc. Mais le problème de ça, ce serait que si le changement de map est pas possible (du genre si c'est une map cul-de-sac), il ne saura pas gérer :).

Donc pour résumer Snakeddp, je pense que le mieux est un fichier .ini avec les noms de section.

Si finalement tu comptes être borné avec un .txt, alors explique-moi PRECISEMENT ce que tu veux dire par "je veux délimiter une recherche". Parce que bon, délimiter une recherche de quoi? Pour quoi? Un exemple? Sois précis, tu auras des réponses beaucoup plus rapidement ;).
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#9
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Ok, j'ai précisé mais je vois que s'est confus pour le .txt
Donc dans mon .txt, il y a 3 sections. Dans cette ordre Banque, retours maps récoltes et maps récoltes).
Plus pratique et s'est OBLIGATOIRE (Lit de haut en bas) pour éviter les erreurs.
Pour illustré, voici un exemple :
Code:
Banque
[5,-24] bas
[5,-23] bas
[5,-22] bas
[5,-21] bas
[5,-20] bas
[5,-19] bas
[5,-18] bas
[5,-17] bas
[5,-16] gauche

Retours 
[4,-16] droite
[5,-16] haut
[5,-16] haut
[5,-17] haut
[5,-18] haut
[5,-19] haut
[5,-20] haut
[5,-21] haut
[5,-22] haut
[5,-23] haut

Recolte
[5,-24] droite
[5,-24] haut
[5,-24] gauche
[5,-24] bas

Si condition est full pods, lire et faire la section Banque (ici je rajoute l'entrée banque, parler pnj et sortie de banque)
Si la map est [x,y] la map de la fin de la section banque et pods <> full pods, lire et faire la section Retous
Si la map d'arrivé après avoir fait la section Retours est une map récolte, lire et faire la section Récolte tout en récoltant les différentes maps.

Désolé si il y a des fautes d'orthographes, je m'en excuses car j'ai le bras gauche dans le plâtre :s et jey² pour ton rang d'apprenti rédacteur ;)

Pour ce qui est du .ini, je vais me renseigner.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#10
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Code:
If "full pods" Then
	For $i=1 To 10
		$indication=FileReadLine("fichier_texte.txt",$i)
		fonction_changer_de_map($indication) ; j'imagine car je ne connais pas le nom de ta fonction
	Next	
EndIf

If "map est [x,y]" Then
	For $i=13 To 22
		$indication=FileReadLine("fichier_texte.txt",$i)
		fonction_changer_de_map($indication) ; j'imagine car je ne connais pas le nom de ta fonction
	Next	
EndIf

If "map récolte" Then
	For $i=25 To 28
		$indication=FileReadLine("fichier_texte.txt",$i)
		fonction_changer_de_map($indication) ; j'imagine car je ne connais pas le nom de ta fonction
	Next
EndIf
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#11
Re: [Demande & Aide] Délimiter une recherche dans un .txt

NicoMasterChief, Merci bien, mais le problème sera pour chaque trajet, je devrais changer manuellement le tout.
Ah moins que je rajoute un compteur de ligne entre 2 section et que je retourne sa sous forme d'un tableau... astucieux.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#12
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Snakeddp a dit:
NicoMasterChief, Merci bien, mais le problème sera pour chaque trajet, je devrais changer manuellement le tout.
Ah moins que je rajoute un compteur de ligne entre 2 section et que je retourne sa sous forme d'un tableau... astucieux.
Rien compris ^^'
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#13
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Désolé si j'oubli des mots ou autres,
Donc pour chaque trajet.txt différent, soit je fais comme tu dis et je devrais changer les valeurs selon le nombre de ligne entre mes sections soit j'ajoute un compteur de ligne pour chaque section exemple:


Code:
Banque (10 ligne après cette ligne) 
[5,-24] bas
[5,-23] bas
[5,-22] bas
[5,-21] bas
[5,-20] bas
[5,-19] bas
[5,-18] bas
[5,-17] bas
[5,-16] gauche

Retours (11 ligne après cette ligne)
[4,-16] droite
[5,-16] haut
[5,-16] haut
[5,-17] haut
[5,-18] haut
[5,-19] haut
[5,-20] haut
[5,-21] haut
[5,-22] haut
[5,-23] haut

Recolte (4 ligne après cette ligne)
[5,-24] droite
[5,-24] haut
[5,-24] gauche
[5,-24] bas

Ce qui donnerait un tableau avec

Banque 11
Retours 12
Récolte 5

soit pour $i = 1 to 11
soit pour $i = 1+12 to 11+12
soit pour $i = 13+5 to 23+5
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#14
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Pourquoi tu fais pas comme je t'ai dit , je repete tu lis ligne a ligne jusque trouver "Banque" ou "Retour" , un fois que tu as cette ligne de depart tu lis ligne a ligne jusque trouver une chaine vide -> "" , c'est peu etre trop simple de faire comme ca , vaut mieux des boucles et un fichier txt avec un configuration (qui sert juste a le faire lire lui meme) ?
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#15
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Oui mais le problème s'est que j'ai lu mais j'y est pas trouvé comment écrire en AutoIt ce qu'il fallait pour faire ce que tu dis.

Code:
	$path = @ScriptDir & "\chemins\chemin_ble.txt"
	Local $file = FileOpen($path)

	If $file <> -1 Then
		$nb_Lignes = _FileCountLines($path)
		For $i = 1 To $nb_Lignes
			$ligne = FileReadLine($file, $i)
			$Start_Read_banque_Line = StringInStr($ligne, "Banque" & @CRLF)
			$End_Read_banque_Line = StringInStr($ligne, @CRLF)

			$Start_Read_retours_Line = StringInStr($ligne, "retours" & @CRLF)
			$End_Read_retours_Line = StringInStr($ligne, @CRLF)	
		
			$Start_Read_recolte_Line = StringInStr($ligne, "recolte" & @CRLF)
			$End_Read_recolte_Line = StringInStr($ligne, @CRLF)
		Next

Je suis pas sur de sa ...
 
A

Anonymous

Invité
#16
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Bonsoir,

ceci pourrai vous aider a voire "une autre options";
Code:
#Include <Array.au3>
Local $file=FileRead(@ScriptDir&"\test.txt")
$array = StringRegExp($file,"(?i)(\[.*,.*\])",3)
_ArrayDisplay($array)
test.txt contient donc le texte qui vous avez mit plus haut

Ce que toons vous proposait est vraiment simple à mettre en oeuvre en réalité ^^

Ce que je vous conseillerai cependant est d'utiliser des méthodes utile déja prévue ;-)

notamment celle-ci : - _FileReadToArray()

Code:
#include <file.au3>
Local $array
Local $trouve=False
If _FileReadToArray(@ScriptDir&"\test.txt",$array) Then
	For $i=1 To $array[0]
		If StringInStr($array[$i],"banque") Then
			$trouve=True
		Else
			If $array[$i]="" And $trouve Then
				ExitLoop
			ElseIf $trouve Then
				MsgBox(0,"",$array[$i])
			EndIf
		EndIf
	Next
Else
	MsgBox(64,"erreur","erreur de lecture du fichier")
EndIf

@d4rkv4n: Je ne voit pas la différence entre un fichier .ini/.txt, ... qui contient en détail chaque "trajet" et la manière que j'utilise. Du fait que je peux n’écrire que les coordonnée d'arrivée et de fin tout en mettant les "trajet" intermédiaire, de même que l'ajout d'un trajet "case par case" c'est la même chose ... Parceque mon algo qui reste très simple ne fait que "spliter" 2 coordonées en des mouvements "case par case".
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#17
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Je sais, et c'est bien, c'est ce que je lui ai dis de faire via Skype.
En fait, ce petit morceau :

[5,-18] haut

sert juste de "repère". Mais le script qu'on a fait lui et moi permet de calculer à lui seul la direction où aller, justement en splittant les coordonnées. Mais si par exemple, si mets "gauche" au lieu de "haut", le script te le dira, que ton trajet n'est pas correct. Et donc, c'est juste par vérification.

Dans ce cas, je me suis dis "on a besoin de vérifier seulement parce que le créateur du script peut être un peu bête". Et donc, pourquoi ne pas proposer de faire un système du genre "je veux aller de 4,-16 jusqu'en 5,-18", et laisser le script se démerder tout seul x).

En résumé, ça ferait gagner du temps au créateur du trajet. Eviter d'écrire 30 lignes, alors qu'il doit bêtement monter de 30 cases. Tu comprends?

Et la différence entre un .ini/.txt? C'est simple, le .ini est exactement là pour ça ! Il respecte une structure etc. Dans notre cas oui, la différence n'est pas flagrante puisque finalement, notre trajet.txt reprend la structure d'un trajet.ini.

Je ne sais pas si tu as déjà développé du web, mais c'est comme si tu écrivais en XML dans un .txt, et que tu devais parser ton .txt. Un peu con, vu que t'as tout ce qu'il faut qui gère le XML. Enfin, voilà :).


Quoiqu'il en soit @Snakeddp, tout ce qui est dit ici est tout à fait correct, sers-t-en.
 
Inscrit
24 Février 2012
Messages
55
Reactions
0
#18
Re: [Demande & Aide] Délimiter une recherche dans un .txt

Merci bien, je vais pencher sur plusieurs méthodes de trajet,
La 1er était de faire tournée sur des maps récoltes, (Reussi)
La 2ème étant le retours banques avec la totalité des actions, (En cours, 99% de fait)
Et la 3 ème, le script géré par un algo performant et pratique.

Je vous remercie tous et toute pour votre aide. Toutefois, je suis dispo sur skype pour une aide manuelle... Besoin d'une main gauche ;)
Mon skype est snake_ddp
Pour de ce qui est des erreurs de consolewrite, j'en est pu d4rkv4n.

Voilà j'ai fini ma délimitation de mes 3 sections.
Banque:
Code:
#include <file.au3>
#Include <Array.au3>
	$path = @ScriptDir & "\Banque.txt"
	Local $file = FileOpen($path)
$array = StringRegExp($file,"(?i)(\[.*,.*\])",3)
_ArrayDisplay($array)


Local $array
Local $trouve=False
If _FileReadToArray(@ScriptDir&"\Banque.txt",$array) Then
   For $i=1 To $array[0]
      If StringInStr($array[$i],"banque") Then
         $trouve=True
      Else
         If $array[$i]="" And $trouve Then
            ExitLoop
         ElseIf $trouve Then
            MsgBox(0,"",$array[$i])
         EndIf
      EndIf
   Next
Else
   MsgBox(64,"erreur","erreur de lecture du fichier")
EndIf
Retours:
Code:
#include <file.au3>
#Include <Array.au3>
	$path = @ScriptDir & "\Banque.txt"
	Local $file = FileOpen($path)
$array = StringRegExp($file,"(?i)(\[.*,.*\])",3)
_ArrayDisplay($array)


Local $array
Local $trouve=False
If _FileReadToArray(@ScriptDir&"\Banque.txt",$array) Then
   For $i=1 To $array[0]
      If StringInStr($array[$i],"retours") Then
         $trouve=True
      Else
         If $array[$i]="" And $trouve Then
            ExitLoop
         ElseIf $trouve Then
            MsgBox(0,"",$array[$i])
         EndIf
      EndIf
   Next
Else
   MsgBox(64,"erreur","erreur de lecture du fichier")
EndIf

recolte
Code:
#include <file.au3>
#Include <Array.au3>
	$path = @ScriptDir & "\Banque.txt"
	Local $file = FileOpen($path)
$array = StringRegExp($file,"(?i)(\[.*,.*\])",3)
_ArrayDisplay($array)


Local $array
Local $trouve=False
If _FileReadToArray(@ScriptDir&"\Banque.txt",$array) Then
   For $i=1 To $array[0]
      If StringInStr($array[$i],"recolte") Then
         $trouve=True
      Else
         If $array[$i]="" And $trouve Then
            ExitLoop
         ElseIf $trouve Then
            MsgBox(0,"",$array[$i])
         EndIf
      EndIf
   Next
Else
   MsgBox(64,"erreur","erreur de lecture du fichier")
EndIf
Il ne me manque pu qu'à tout assembler.
Petite question, que fait StringRegExp($file,"(?i)(\[.*,.*\])",3) et qu'est ce que sa veut dire car je n'ai pas compris même après avoir lu la doc.
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#19
Re: [Résolu][Demande & Aide]Délimiter une recherche dans un

Oula, les Regexp et moi, ça fait... Au moins ça [.*,.*\])" !! :D.
Une Regexp permet en fait d'effectuer une recherche sur une String. Mais attention, si tu sais bien l'utiliser, c'est pas des petites recherches bidon, mais de belles recherches du genre pour vérifier si une adresse mail est correcte, en une seule ligne.

Sur la toile, tu sauras trouver ton bonheur :).
 
A

Anonymous

Invité
#20
Re: [Résolu][Demande & Aide]Délimiter une recherche dans un

Bonjour,
le regex que j'ai mit est en réalité très simple ^^

"(?i)(\[.*,.*\])" decortiquons ca ...

(?i) : pour dire de rechercher peu importe la case
\[ : je cherche une "["
.* : n'importe quel caractère 0 à n fois
, : je cherche ","
\] : je cherche une "]"

donc ceci; "(?i)(\[.*,.*\])" veux dire que je vais rechercher tout ce qui a ce format ci;
[xx,yy]

Même si il serai plus judicieux d'utiliser ceci;
$array = StringRegExp($file,"(?i)(\[-?\d+,-?\d+\])",3)

avec ce regex ci; "(?i)(\[.*,.*\])"
on pourrai très bien match ceci: [a,b]

avec le "nouveau", donc celui ci "(?i)(\[-?\d+,-?\d+\])" ce n'est plus possible ^^
pourquoi?
Car "\d+" veux dire de recherche de 1 à n digit (0 à 9 donc)
"-?" veux dire que il est possible qu'il y'a un "-" mais c'est pas sur.
 
Haut Bas