Page 1 sur 1

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

Posté : jeu. 29 oct. 2020 16:49
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

Re: [..] Aide pour optimiser code

Posté : jeu. 29 oct. 2020 19:13
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

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

Posté : jeu. 29 oct. 2020 19:30
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.

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

Posté : ven. 30 oct. 2020 11:49
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 ?

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

Posté : ven. 30 oct. 2020 15:36
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.

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

Posté : ven. 30 oct. 2020 18:04
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à ?)

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

Posté : ven. 30 oct. 2020 21:10
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)

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

Posté : ven. 30 oct. 2020 22:07
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:

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

Posté : ven. 30 oct. 2020 22:31
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.

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

Posté : ven. 30 oct. 2020 22:58
par walkson
Image

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

Posté : sam. 31 oct. 2020 09:42
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.