[R] Aide pour optimiser code afin de transposer colonne en ligne

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

[R] Aide pour optimiser code afin de transposer colonne en ligne

#1

Message par Boulanza »

Bonjour,
J'ai un fichier Excel avec X colonnes, la colonne A comporte tous les codes des dossiers, la colonne B les noms des dossiers. Je recherche comment on peut copier le contenu de la colonne A mais à partir de l’intitulé (mot) « Codes Dossiers » dans fichier texte (test.txt) en ligne, en séparant chaque code par une virgule. (1xxxxxxx, 2xxxxxxx, 3xxxxxxx, …)
Ci-joint le code que je cherche à optimiser. Merci d’avance pour votre aide.
Cordialement,
#include <Excel.au3>
Global $sLine = ""
Global $oExcel = _Excel_Open()
Global $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\Excel.xlsx")
Global $aContent = _Excel_RangeRead($oWorkbook)
_Arraydisplay($aContent)
For $i = 0 To UBound($aContent, 1) - 1
    $sLine = ""
    For $j = 0 To UBound($aContent, 2) - 1
        If $j = 0 Then
            $sLine = $aContent[$i][$j]
        Else
           ;;$sLine = $sLine & "|" & $aContent[$i][$j]  désactiver pour ne copier que la colonne A
        EndIf
    Next
    ;ConsoleWrite($sLine & @CRLF)
Local $Path = @ScriptDir & "\Excel.txt"
FileWriteLine($Path, $sLine&@CRLF)
Next
Modifié en dernier par Boulanza le sam. 31 oct. 2020 07:16, modifié 3 fois.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 911
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Aide pour optimiser code

#2

Message par walkson »

Bonjour,
A la lecture de votre code, nous avons
1xxxxxxx
 2xxxxxxx
 3xxxxxxx
et vous souhaitez avoir 1xxxxxxx, 2xxxxxxx, 3xxxxxxx si j'ai bien compris...
Avant de vous proposer un code, que souhaitez vous faire avec le txt ? Si c'est pour faire un StringSplit() votre code convient avec delimiters @crlf
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#3

Message par Boulanza »

Bonsoir Monsieur walkson,
Oui c'est ça , les codes doivent être sur des ligne soit donc: 20 codes par ligne, chaque code se compose de 9 chiffres:
1xxxxxxx,2xxxxxxxx,3xxxxxxxx,...
walkson a écrit : jeu. 29 oct. 2020 19:13 Avant de vous proposer un code, que souhaitez vous faire avec le txt ? Si c'est pour faire un StringSplit() votre code convient avec de limiter @crlf

- Au fait ce n'est pas .txt mais copier les données de la colonne dans un script au3.
- @crlf je ne vois pas comment ?
Cordialement.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 911
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#4

Message par walkson »

Bonjour,
- @crlf je ne vois pas comment ?
$read = FileRead($cheminTXT)
$array = StringSplit($read, @CRLF)
Sinon en 1xxxxxxx, 2xxxxxxx, 3xxxxxxx
Global $sLine = ""
Global $oExcel = _Excel_Open()
Global $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\Excel.xlsx")
Global $aContent = _Excel_RangeRead($oWorkbook)
_Arraydisplay($aContent)
For $i = 0 To UBound($aContent, 1) - 1
   
    For $j = 0 To UBound($aContent, 2) - 1
        If $j = 0 Then
            $sLine &= $aContent[$i][$j] & ","
        Else
           ;;$sLine = $sLine & "|" & $aContent[$i][$j]  désactiver pour ne copier que la colonne A
        EndIf
    Next
    ;ConsoleWrite($sLine & @CRLF)
Next
$sLine = StringTrimRight($sLine,1) ;supprime le dernier ","
Local $Path = @ScriptDir & "\Excel.txt"
$open = FileOpen($Path,1);Mode écriture (ajoute à la fin du fichier)
FileWrite($open, $sLine)
FileClose($open)
[Edit] Je viens de voir que vous avez changé le titre de votre post
Vous avez une fonction qui transpose un array _ArrayTranspose ( ByRef $aArray ) peut être vous sera t'elle utile ?
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#5

Message par Boulanza »

Bonjour Monsieur walkson,
Merci pour votre aimable aide. Votre suggestion marche très bien. Juste un petit souci:
J'ai des espaces blanc, pour cela je voulais ajouter le scripte ci-dessous afin de supprimer tous les espaces et copier le résultat de _ArrayDisplay($s) dans le fichier : ResulatExcel1.txt. C'est la ou je cale ...
Local $Path = @ScriptDir & "\Excel1.txt"
$r = FileRead($Path)
$s = StringRegExp(StringRegExpReplace($r, '\h{2,}', " "), '(?m)^\h*(\S.*)\h*$', 3)
$Copy = _ArrayDisplay($s)
;ConsoleWrite($sLine & @CRLF)
Local $Path2 = @ScriptDir & "\ ResulatExcel1.txt"
FileWriteLine($Path2, $Copy)
Exit
Cordialement.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 911
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#6

Message par walkson »

et avec StringStripWS ( "string", flag ) ?....
avec $sLine &= $aContent[$i][$j] & "," en appliquant la fonction sur $aContent[$i][$j] (si les espaces viennent de là ?)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#7

Message par Boulanza »

Bonsoir Monsieur walkson,
walkson a écrit : ven. 30 oct. 2020 18:04 et avec StringStripWS ( "string", flag ) ?....
avec $sLine &= $aContent[$i][$j] & "," en appliquant la fonction sur $aContent[$i][$j] (si les espaces viennent de là ?)
Votre dernière suggestion ci-dessus n'a pas pu fonctionner lors de son intégration dans le code corrigé. Pour échapper à cela, voici le scripte qui supprime les espace vide à 99%. Si vous pouvez me proposer mieux que celui-ci, je serais très ravi... :bisou:
Cordialement
Local $Path = @ScriptDir & "\Excel1.txt"
$r = FileRead($Path)
$res = StringRegExp(StringRegExpReplace($r, '\h{2,}', " "), '(?m)^\h*(\S.*)\h*$', 3)
Local $Path2 = @ScriptDir & "\Excel2.txt"
_FileWriteFromArray($Path2, $res)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 911
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#8

Message par walkson »

:roll:
#include <StringConstants.au3>
Local $Path = @ScriptDir & "\Excel1.txt"
$r = FileRead($Path)
$res = StringStripWS ($r,$STR_STRIPALL);  $STR_STRIPALL (8) = enlève tous les espaces (englobe tous les autres paramètres)
FileWrite( @ScriptDir & "\Excel2.txt",$res)
https://www.autoitscript.fr/autoit3/doc ... tripWS.htm :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#9

Message par Boulanza »

Bonsoir,
Oui ça marche parfaitement, pas d'espace sur toute la ligne.
Par cotre, WinSetState("ArrayDisplay", "", @SW_HIDE) ne fonctionne pas sur le code ? !! je ne comprends pas pourquoi ! :shock:
Cordialement.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 911
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Aide pour optimiser code afin de transposer colonne en ligne

#10

Message par walkson »

Image
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Boulanza
Niveau 9
Niveau 9
Messages : 657
Enregistré le : mer. 31 juil. 2013 15:49
Status : En ligne

Re: [R] Aide pour optimiser code afin de transposer colonne en ligne

#11

Message par Boulanza »

Bonjour,
Pour partager, voici le code qui marche parfaitement, peut-être on peut faire mieux.
Merci Monsieur walkson pour vote aide.
Cordialement.
test1()
Func test1()
Global $sLine = ""
Global $oExcel = _Excel_Open()
Global $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\Excel.xlsx")
Global $aContent = _Excel_RangeRead($oWorkbook)
;_Arraydisplay($aContent)
For $i = 0 To UBound($aContent, 1) - 1
    For $j = 0 To UBound($aContent, 2) - 1
        If $j = 0 Then
            $sLine &= $aContent[$i][$j] & "|"
      Else
           ;;$sLine = $sLine & "|" & $aContent[$i][$j]  désactiver pour ne copier que la colonne A
      EndIf
    Next
    ;ConsoleWrite($sLine & @CRLF)
Next
$sLine = StringTrimRight($sLine,1) ;supprime le dernier ","
Local $Path = @ScriptDir & "\Excel1.txt"
$open = FileOpen($Path,1);Mode écriture (ajoute à la fin du fichier)
FileWrite($open, $sLine)
Sleep(2000)
FileClose($open)
Sleep(200)
;======================
;;Supprimer les espaces du ficier txt
Local $Path = @ScriptDir & "\Excel1.txt"
$r = FileRead($Path)
$res = StringStripWS ($r,$STR_STRIPALL);  $STR_STRIPALL (8) = enlève tous les espaces (englobe tous les autres paramètres)
FileWrite( @ScriptDir & "\Excel2.txt",$res)
WinClose("Excel.xlsx - Excel")
;=======================
EndFunc
La liberté d'expression est un droit humain fondamental.
Répondre