[R] Repositionnement de chaînes dans fichier txt

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
nono264
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 17 févr. 2017 12:07
Status : Hors ligne

[R] Repositionnement de chaînes dans fichier txt

#1

Message 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. :D
Modifié en dernier par nono264 le dim. 26 févr. 2017 19:21, modifié 1 fois.
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#2

Message 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?
nono264
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 17 févr. 2017 12:07
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#3

Message 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 :(
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#4

Message 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 lecture
Local $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 lignes
for $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
Modifié en dernier par parazitenew le dim. 26 févr. 2017 18:38, modifié 2 fois.
nono264
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 17 févr. 2017 12:07
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#5

Message 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.: :?
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#6

Message 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é.
nono264
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 17 févr. 2017 12:07
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#7

Message par nono264 »

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

Re: [..] Repositionnement de chaînes dans fichier txt

#8

Message par mikell »

Pour le fun :mrgreen:

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


" 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
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#9

Message 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.
nono264
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 17 févr. 2017 12:07
Status : Hors ligne

Re: [..] Repositionnement de chaînes dans fichier txt

#10

Message par nono264 »

J'ai rajouter à la ligne 41 :

$file = FileOpen(@ScriptDir&"/b.txt", 128)

Et ça fonctionne :D

Un grand merci à vous deux !!
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#11

Message 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.
$hFile = FileOpen(@ScriptDir & "\a.txt")
$t = ""
While 1
   $line = FileReadLine($hFile)
   If @error Then ExitLoop

   $t &= StringLeft($line, 32)

   $line = StringTrimLeft($line, 32)
   $split = StringSplit($line, "/")

   $txt = ""
   For $i = 1 To $split[0] - 1
      $txt &= StringFormat("%-20s", $split[$i])
   Next
   $t &= $txt & $split[$i] & @CRLF
WEnd
FileClose($hFile)

ConsoleWrite($t & @CRLF)
Modifié en dernier par orax le dim. 26 févr. 2017 19:50, modifié 1 fois.
Raison : ^^
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#12

Message 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
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#13

Message 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.
$h = FileOpen("b.txt", 2)
FileSetPos($h, 5, 0)
FileWrite($h, "A")
FileClose($h)
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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#14

Message par parazitenew »

J'ai utilisé le bloc note de Windows, t'as essayé avec quoi?
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#15

Message 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.
$h = FileOpen("b.txt", 2)
FileSetPos($h, 5, 0)
FileWrite($h, "A")
FileClose($h)
ConsoleWrite(Binary(FileRead("b.txt")) & @CRLF)
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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Repositionnement de chaînes dans fichier txt

#16

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