Page 1 sur 1
					
				[R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 10:40
				par nono264
				Bonjour à tous,
Je débute avec les Regex, et là je bloque avec la manipulation et le repositionnement de données.
Mon fichier initial son compose ainsi :
Code : Tout sélectionner
000017 001101 000011 000495 W 1 TEXTE EXEMPLE1/TEXTE EXEMPLE2/TEXTE EXEMPLE3/TEXTE EXEMPLE4
000017 001102 000011 000435 W 1 TEXTE EXEMPLE1/TEXTE EXEMPLE2/TEXTE EXEMPLE3
000017 001103 000011 000355 W 1 TEXTE EXEMPLE1/TEXTE EXEMPLE2
000017 001104 000011 000355 W 2 TEXTE EXEMPLE1/TEXTE EXEMPLE2/TEXTE EXEMPLE3/TEXTE EXEMPLE4
000017 001105 000011 000355 W 1 TEXTE1/TEXTE2/TEXTE3/TEXTE4
000017 001106 000011 000370 W 1 TEXTE1/TEXTE2
000017 001107 000011 000370 W 2 TEXTE1/TEXTE2/TEXTE3/TEXTE4
000017 001108 000011 000435 W 2 TEXTE EXEMPLE1/TEXTE EXEMPLE2/TEXTE EXEMPLE3/TEXTE EXEMPLE4
Le résultat souhaité :
Code : Tout sélectionner
000017 001101 000011 000495 W 1 TEXTE EXEMPLE1      TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
000017 001102 000011 000435 W 1 TEXTE EXEMPLE1      TEXTE EXEMPLE2      TEXTE EXEMPLE3
000017 001103 000011 000355 W 1 TEXTE EXEMPLE1      TEXTE EXEMPLE2
000017 001104 000011 000355 W 2 TEXTE EXEMPLE1      TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
000017 001105 000011 000355 W 1 TEXTE1              TEXTE2              TEXTE3              TEXTE4
000017 001106 000011 000370 W 1 TEXTE1              TEXTE2
000017 001107 000011 000370 W 2 TEXTE1              TEXTE2              TEXTE3              TEXTE4
000017 001108 000011 000435 W 2 TEXTE EXEMPLE1      TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
La position du TEXTE EXEMPLE2 serait fixé à la position 53, TEXTE EXEMPLE3 à la 73 et TEXTE4 à la 93.
Merci par avance pour votre aide.  

 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 14:15
				par parazitenew
				Bonjour, pourquoi vouloir fixer la position? On peut peut être trouver une alternative dans laquelle tu n'as pas à faire ça, c'est quoi le but?
			 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 15:00
				par nono264
				Bonjour,
L'application (gestion de balances) dans laquelle je désire intégrer le fichier résultat n'accepte qu'un positionnement fixe de caractères  

 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 17:24
				par parazitenew
				Dans ce cas, il faut utiliser FileSetPos()
Exemple:
FileSetPos
($file, 53,0)FileWrite($file, $text)
Ceci place le texte à la 53ème position à partir du début à la ligne.
As tu une idée sur le reste? Bloques tu uniquement sur ça?
EDIT:
J'avais un peu de temps, je me suis penché sur la question, voici un code fonctionnel, il peut surement être amélioré, mais en tout cas il fonctionne, j'ai due utiliser 3 fichiers textes, le fichier initial, un fichier texte intermédiaire, et le fichier texte final.
#include <string.au3>#include <array.au3>#include <file.au3>;Chemin vers le fichier initial$path_origin = @ScriptDir
&"/a.txt";Ouverture du fihcier en mode lectureLocal $file_origin = FileOpen($path_origin);Compte le nombre de ligne dans le fichier$nbr_ligne = _FileCountLines($path_origin);Préparation du fichier final, mode écriture$file_final = FileOpen(@ScriptDir
&"/c.txt",1);Boucle jusqu'à la lecture de toutes les lignesfor $h = 1 To $nbr_ligne   ;Ouverture du fichier intermédiaire en mode écriture (2)        ;je l'ai mis dans la boucle car le mode écriture (2) vide le fichier à l'ouverture, c'est important   $file = FileOpen(@ScriptDir
&"/b.txt",2)   ;Lecture de la ligne à partir du fichier initial   $line = FileReadLine($file_origin,$h)   ;On sépare le texte délimité par les slashs   $array = _StringExplode($line,'/')   ;On écrit sur le fichier intermédiaire la première partie de la ligne.   FileWrite($file,$array[0])   ;Position déclarée à 53   $j = 53      ;Bouvle jusqu'à la lecture de tout le tableau (en commençant par la deuxième ligne, la première a déjà été écrite.      For $i = 1 To UBound($array) -1         ;Position $j         FileSetPos
($file,$j,0)         FileWrite($file,$array[$i])         ; On rajoute 20 à la position, (53, 73, 93)         $j = $j + 20      Next      ;On ouvre le fichier intermédiaire en mode lecture cette fois      $file = FileOpen(@ScriptDir
&"/b.txt")      ;On ecrit sur le fihcier final le résultat      FileWriteLine($file_final,FileRead($file))Next  
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 18:34
				par nono264
				Cela ne fonctionne pas chez moi :
Code : Tout sélectionner
$txt=FileOpen("text.txt",2)
$ligne="000017 001101 001101 000011 000495 W 1 TEXTE EXEMPLE1/TEXTE EXEMPLE2/TEXTE EXEMPLE3/TEXTE EXEMPLE4"
FileWrite($txt,$ligne)
FileFlush($txt)
FileSetPos($txt, 53, 0, "TEXTE EXEMPLE2")
$ligne=FileRead($txt,1)
FileWrite($txt,$ligne)
J'ai une erreur  ==> Incorrect number of parameters in function call.:  

 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 18:36
				par parazitenew
				T'as répondu au moment ou j'éditais mon message, regarde plus haut je t'ai fait un code fonctionnel.
Je m'étais trompé sur mon premier message c'est corrigé.
			 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 18:47
				par nono264
				Cela fonctionne nikel   

 mais par contre je n'ai pas de @CR à la fin de chaque ligne
Code : Tout sélectionner
000017 001101 000011 000495 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4000017 001102 000011 000435 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3000017 001103 000011 000355 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2000017 001104 000011 000355 W 2 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4000017 001105 000011 000355 W 1 TEXTE1               TEXTE2              TEXTE3              TEXTE4000017 001106 000011 000370 W 1 TEXTE1               TEXTE2000017 001107 000011 000370 W 2 TEXTE1               TEXTE2              TEXTE3              TEXTE4000017 001108 000011 000435 W 2 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
Aurais-tu une idée ?
 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 19:08
				par mikell
				Pour le fun  
 
 
Code : Tout sélectionner
Local $new, $a = FileReadToArray("1.txt")
For $i = 0 to UBound($a)-1
   $new &= _Format($a[$i], 53, 20) & @crlf
Next
FileWrite("2.txt", $new)
SplashTextOn("", $new, 1000, 200, -1, -1, 4, "Courier New", 10)
Sleep(5000)
SplashOff()
Exit
Func _Format($str, $first, $next)
  Local $res, $split = StringSplit($str, "/")
  For $i = 1 to $split[0]
     $res &= $split[$i]
     If $i = $split[0] Then Exitloop
     For $n = 0 to $first - StringLen($res)
       $res &= " "
     Next
     $first += $next
  Next
  Return $res
EndFunc
 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 19:09
				par parazitenew
				Pas chez moi:
Code : Tout sélectionner
000017 001101 000011 000495 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
000017 001102 000011 000435 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3
000017 001103 000011 000355 W 1 TEXTE EXEMPLE1       TEXTE EXEMPLE2
000017 001104 000011 000355 W 2 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
000017 001105 000011 000355 W 1 TEXTE1               TEXTE2              TEXTE3              TEXTE4
000017 001106 000011 000370 W 1 TEXTE1               TEXTE2
000017 001107 000011 000370 W 2 TEXTE1               TEXTE2              TEXTE3              TEXTE4
000017 001108 000011 000435 W 2 TEXTE EXEMPLE1       TEXTE EXEMPLE2      TEXTE EXEMPLE3      TEXTE EXEMPLE4
Le FileWriteLine() ajoute automatiquement le retour à la ligne. C'est bizarre.
 
			
					
				Re: [..] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 19:20
				par nono264
				J'ai rajouter à la ligne 41 :
$file = FileOpen(@ScriptDir&"/b.txt", 128)
Et ça fonctionne  
 
 
Un grand merci à vous deux !!
 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 19:39
				par orax
				J'ai des caractères 
NUL (code ASCII zéro) au lieu des espaces, avec le script de parazitenew. Il doit manquer des fonctions FileClose mais je sais pas si ça résout le problème. J'avais donc cherché une autre solution. Pour ajouter les espaces j'ai utilisé 
StringFormat.
 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 20:15
				par parazitenew
				ça pourrait avoir un rapport avec la version d'autoit ? Parce que chez moi je n'ai aucun problème, la version que j'ai utilisé est la 3.4.4
			 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 22:07
				par orax
				La 3.4.4 ? Je n'ai pas trouvé cette version. 3.4.4 est peut-être la version de SciTE.
Certains éditeurs de texte afficheront des espaces à la place des "NUL".
Je pense que le problème est lié à FileSetPos.
Si j'utilise FileSetPos dans un fichier vide, il ajoutera des "NUL" de remplissage.
Si on affiche le fichier avec un éditeur hexadécimal, on verrait quelque chose comme :
00 00 00 00 00 41                                 |.....A|
5 NUL et la lettre A.
 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 22:47
				par parazitenew
				J'ai utilisé le bloc note de Windows, t'as essayé avec quoi?
			 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : dim. 26 févr. 2017 23:47
				par orax
				Ça explique tout, il affiche des espaces. J'utilise en général Notepad++.
On peut d'ailleurs utiliser la fonction Binary pour voir quels sont les caractères avant le A.
Ce code affichera 
0x000000000041.
Alors que s'il y avait eu 5 espaces avant le A, ça aurait affiché : 
0x202020202041.
0x00 = NUL (NULL)
0x20 = espace
0x41 = lettre A
 
			
					
				Re: [R] Repositionnement de chaînes dans fichier txt
				Posté : lun. 27 févr. 2017 15:37
				par TommyDDR
				FileSetPos va "juste" allouer plus de place et effacer cet espace, en aucun cas il mettra des espace, il mettra bien des caractères NULL (0x00).
Sinon, j'allais proposer la solution d'orax donc +1 pour oxax ! 
