Hello,
Voici ci dessous le code que j'ai réussi à avancer :
en me basant bien sur sur ton code, j'ai ajouté quelques options.
Pour l'instant : 1 fichier à filtrer et 1 filtre : ca marche.
pour 1 fichier à filtrer mais plusieurs filtres je n'arrive pas:
la fonction fileopendialog me sort une chaine ainsi : patch\nomfichier.txt|autre_fichier.txt
j'ai alors fait un tableau qui récupere les données, supprime la 1ere ligne (celle qui compte les lignes) avec arraydelete
ensuite je compte combien il reste de lignes
ainsi la 1ere ligne est le path
les suivantes sont les noms des fichiers
l'idée est ensuite d'arriver à creer un tableau qui puisse justement concatener les valeurs de ces fichiers.
J'ai bien trouvé un code mais je n'arrive pas à passer les chemins variables en lecture :
Dim $avFiles[5] = [$test] ne marche pas avec $test = $chemin & $chemin2
j'ai essayé plein de combinaisons et je n'arrive pas
Ca coince là, car si j'arrive à passer du "fileopen" =>tableau qui liste les noms de fichier filtres=>concatene les données
je peux réinjecter ca dans ton code final de filtrage.
d'ailleurs ce qui est bizarre, c'est pourquoi fileopen ne donne pas des path completes séparées ?
bizarre de devoir passer par un stringsplit puis tableau pour filtrer les chemins et les reconstruire...
:
#include <FileConstants.au3>#include <MsgBoxConstants.au3>#include <Array.au3>#include <File.au3>;mon essai avec cette variable mais dans l'exemple qui marche y'a pas Ca;https://www.autoitscript.com/forum/topic/37866-read-multiple-files-into-1-array/$chemin = "C:\Users\Admin\OneDrive\tri par autoit\filtre1.txt"$chemin2 = "C:\Users\Admin\OneDrive\tri par autoit\filtre2.txt"$test = $chemin & $chemin2 ; marche pas;Dim $avFiles[5] = [$chemin , $chemin2] ; ca fonctionneDim $avFiles[5] = [$test] ; marche pasDim $sString = ""For $n = 0 To UBound($avFiles) - 1 $sString &= FileRead($avFiles[$n], FileGetSize($avFiles[$n])) If StringRight($sString, 2) <> @CRLF Then $sString &= @CRLFNext$avLines = StringSplit($sString, @CRLF, 1)_ArrayDisplay($avLines, "Displaying " & $avLines[0] & " lines from " & UBound($avFiles) & " files.")
#include <FileConstants.au3>#include <MsgBoxConstants.au3>#include <Array.au3>#include <File.au3>Func_depart
()Func Func_depart
() ; Crée une constante locale avec le message à afficher dans FileOpenDialogAFILTRER. Local Const $sMessage1 = "A FILTRER : choisir le fichier" ; Ouvre une boîte de dialogue pour sélectionner une liste de fichier(s) qui seront le ou les filtres Local $sFileOpenDialogAFILTRER = FileOpenDialog($sMessage1, @WorkingDir & "\", "txt ou ini (*.ini;*.txt)", $FD_FILEMUSTEXIST) If @error Then ; Affiche le message d'erreur. MsgBox($MB_SYSTEMMODAL, "", "Aucun fichier sélectionné.") EndIf ; Crée une constante locale avec le message à afficher dans FileOpenDialogFILTRES. Local Const $sMessage2 = "FILTRES : Appuyez sur Ctrl ou Shift pour choisir plusieurs fichiers" ; Ouvre une boîte de dialogue pour sélectionner une liste de fichier(s) qui seront le ou les filtres Local $sFileOpenDialogFILTRES = FileOpenDialog($sMessage2, @WorkingDir & "\", "txt ou ini (*.ini;*.txt)", $FD_FILEMUSTEXIST + $FD_MULTISELECT) If @error Then ; Affiche le message d'erreur. MsgBox($MB_SYSTEMMODAL, "", "Aucun fichier sélectionné.") Else ; Change le répertoire de travail (@WorkingDir) vers l'emplacement du répertoire de script comme FileOpenDialog l'a défini au dernier dossier consulté. FileChangeDir(@ScriptDir) EndIf func_suite
($sFileOpenDialogFILTRES,$sFileOpenDialogAFILTRER);fin de la selection des différents fichiersEndFunc;ca va mettre dans un tableau toute la selection;mais le tableau affiche dans la 1ere ligne (numerotée zero) le nombre total d'éléments;il faut alors juste recuperer les données path (chemin) et ensuite chaque nom de fichierFunc func_suite
($sFileOpenDialogFILTRES,$sFileOpenDialogAFILTRER);Diviser la chaîne de path en utilisant le délimiteur "|" et la valeur de flag par défaut.Local $aPath = StringSplit($sFileOpenDialogFILTRES, "|")_ArrayDisplay($aPath,"Tableau non traité") ;affichage tableau non traité avec le listing des noms des fichiers de filtres_ArrayDelete($aPath, 0) ;supprimer la 1ere ligne numérotée zero_ArrayDisplay($aPath, "ligne 0 du tableau supprimée pour enlever le compteur") ; affichage du tableau avec la ligne zero en moins (celle qui affiche le nombre de lignes mais ne sert a rien);essai divers marche pour plusieurs fichiers selectionnés;MsgBox(0, "test affichage","le contenu est " & _ArrayToString($aPath," ainsi que " , 0, 4)) ; affiche le contenu du tableau de la ligne 0 à 4;$sString_Indirect = "";For $i = 2 To 4 ; affiche le contenu de la ligne 2 à 4 ; $sString_Indirect &= '"' & $aPath[$i] & '" ' ; ca affiche entre des " chaque contenu de ligne;Next;MsgBox(0, "test affichage par boucle de ligne 2 à 4", $sString_Indirect);fin essais divers; calcul du nombre de lignes dans le tableauLocal $iRows = UBound($aPath, $UBOUND_ROWS) ;MsgBox($MB_SYSTEMMODAL, "coucou", "le tableau contient exactement " & _
$iRows & " ligne(s) ") MsgBox($MB_SYSTEMMODAL, "Path épurée", _ArrayToString($aPath,"",0,0) ) ; affiche juste le conteu de la ligne 0 à 0 on peut supprimer le ,0 à la fin $Pathok = _ArrayToString($aPath,"",0,0)If $iRows = 1 Then MsgBox ($MB_SYSTEMMODAL,"unique", "il y a un seul fichier donc " & @CRLF & $Pathok & @CRLF & " sera le chemin avec le nom")Else $sLesfichiers = "" For $i = 1 To $iRows - 1 $sLesfichiers &= '"' & $aPath[$i] & '",' ; ca va creer une chaine de cette forme "nomdufichier","nom_autre",Next $sLesfichiersmod = StringTrimRight ($sLesfichiers, 1) ; ca recrée la chaine avec les noms mais sans la derniere virgule (stringsplitright enleve 1 caractere )MsgBox(0, "creation de la ligne des noms", $sLesfichiers)MsgBox(0, "creation de la ligne des noms modifiés", $sLesfichiersmod) MsgBox ($MB_SYSTEMMODAL,"multiple", "il y a plusieurs fichiers donc le chemin sera :" & @CRLF & $Pathok & @CRLF & "et les fichiers seront" & @CRLF & $sLesfichiersmod )EndIf;ici le traitement des données;pour 1 seul fichier filtreif $iRows = 1 Then $sFileOpenDialog2 = '"' & $Pathok & '"' MsgBox ($MB_SYSTEMMODAL," pour voir" , $sFileOpenDialog2 )Else;pour plusieurs fichiers filtres ;il faut faire une boucle pour creer une chaine path noms mais comment mettre dans le array plusieurs fichiers ??? ;voir fonction arrayaddEndIf$aList = FileReadToArray
( $sFileOpenDialogAFILTRER) ; liste _ArrayDisplay($aList,"contenu working à filtrer"); pour voir ce qui est en donnéesMsgBox ($MB_SYSTEMMODAL," pour voir si c'est bien entre guillemets" , $sFileOpenDialog2 )If $iRows= 1 Then$aExcl = FileReadToArray
( $Pathok) ; exclusions attention le chemin lorsqu'il est dans une variable ne doit pas avoir de guillemets _ArrayDisplay($aExcl,"A supprimer")Else; ici il faut utiliser une boucle qui prend la liste des fichiers txt et les mets en 1 seul tableau Dim $avFiles[5] = ;ICI IL FAUDRAIT ARRIVER A METTRE LA LISTE DES FICHIERS FILTRESDim $sString = ""For $n = 0 To UBound($avFiles) - 1 $sString &= FileRead($avFiles[$n], FileGetSize($avFiles[$n])) If StringRight($sString, 2) <> @CRLF Then $sString &= @CRLFNext$avLines = StringSplit($sString, @CRLF, 1)_ArrayDisplay($avLines, "Displaying " & $avLines[0] & " lines from " & UBound($avFiles) & " files.")EndIf; construction du dictionnaire$sdList = ObjCreate("Scripting.Dictionary")For $i In $aList $sdList.Item($i)Next; suppression dans le dico des éléments présents dans les exclusionsFor $i In $aExcl If $sdList.Exists($i) Then $sdList.Remove($i)Next; lecture du dico nettoyé dans une array$asdList = $sdList.Keys()_ArrayDisplay("hide",$asdList);sauvegarde du resultat$sFile = FileSaveDialog("Enregistrer sous...", @ScriptDir, "Text Files (*.txt) | ini Files (*.ini) | All Files (*.*)", 18, "")If @error Then Exit$sString = _ArrayToString($asdList , @crlf, Default, Default, @CRLF)FileWrite($sFile, $sString) EndFunc