Page 1 sur 1
[Func] ArrayCompare avec récupération des lignes différentes
Posté : lun. 27 janv. 2014 00:09
par mikell
Hello
Cette fonction permet de comparer 2 arrays et de récupérer l'index et le contenu des lignes différentes
Utilisée pour comparer 2 fichiers, elle retourne le numéro des lignes différentes et leur contenu
3 options possibles :
- récupérer les éléments de l'array 1 qui ne figurent pas dans l'array 2
- récupérer les éléments de l'array 2 qui ne figurent pas dans l'array 1
- récupérer les deux
Elle utilise une BDD Sqlite mémoire temporaire pour limiter le temps de traitement en cas de grosses arrays ou de gros fichiers (plusieurs milliers de lignes) donc attention de bien conserver les includes
► Afficher le texte
Code : Tout sélectionner
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
; exemple avec le fichier WindowsConstants.au3 (819 lignes)
; lecture du fichier
$file = FileRead(StringRegExpReplace(@Autoitexe, '(.+)\\[^\\]+', "$1") & "\Include\WindowsConstants.au3")
; création des 2 arrays (si utilisation de _FileReadToArray, mettre $Flag = 0 )
$aLines = StringRegExp($file, '(?m)(^.*)\R?', 3)
$aLines2 = $aLines
; rajout de quelques lignes supplémentaires dans les arrays
For $i = 15 to UBound($aLines)-1 step 100
_ArrayInsert($aLines, $i, "Global Const $WS_FAKE = extra line*" & Ceiling($i/100))
_ArrayInsert($aLines2, $i+3, "Global Const $WS_EX_FAKE = extra line 2*" & Ceiling($i/100))
_ArrayInsert($aLines2, $i+6, "Global Const $WM_FAKE = extra line 2*" & Ceiling($i/100) & "bis")
Next
; _ArrayDisplay($aLines)
$res = _ArrayCompareAndGetZeData($aLines, $aLines2, 0)
_ArrayDisplay($res)
;==============================================================
; $flag = 1 : retourne les items de l'array 1 absents dans la 2 (avec le n° de ligne)
; $flag = 2 : retourne les items de l'array 2 absents dans la 1 (avec le n° de ligne)
; $flag = 0 : retourne les deux
;==============================================================
Func _ArrayCompareAndGetZeData($array1, $array2, $flag = 0)
If $flag < 0 OR $flag > 2 Then $flag = 0
Local $array, $aTemp, $iRows, $iColumns
_SQLite_Startup()
_SQLite_Open() ; ':memory:'
_SQLite_Exec (-1, "CREATE TABLE table1 (id, items1); CREATE TABLE table2 (id, items2);")
_SQLite_Exec(-1, "Begin;")
For $i = 0 to UBound($array1)-1
_SQLite_Exec(-1, "INSERT INTO table1 VALUES (" & $i & ", " & _SQLite_FastEscape($array1[$i]) & ");")
Next
For $i = 0 to UBound($array2)-1
_SQLite_Exec(-1, "INSERT INTO table2 VALUES (" & $i & ", " & _SQLite_FastEscape($array2[$i]) & ");")
Next
_SQLite_Exec(-1, "Commit;")
Switch $flag
Case 1
_SQLite_GetTable2d(-1, "SELECT * FROM table1 " & _
"WHERE items1 NOT IN (SELECT items2 FROM table2) ;", $array, $iRows, $iColumns)
Case 2
_SQLite_GetTable2d(-1, "SELECT * FROM table2 " & _
"WHERE items2 NOT IN (SELECT items1 FROM table1) ;", $array, $iRows, $iColumns)
Case 0
_SQLite_GetTable2d(-1, "SELECT * FROM table1 " & _
"WHERE items1 NOT IN (SELECT items2 FROM table2) ;", $array, $iRows, $iColumns)
_SQLite_GetTable2d(-1, "SELECT * FROM table2 " & _
"WHERE items2 NOT IN (SELECT items1 FROM table1) ;", $aTemp, $iRows, $iColumns)
Local $n = UBound($array)-1, $m = UBound($aTemp)-1
Local $s = ($n > $m) ? $n : $m
Redim $array[$s+1][4]
For $i = 0 to $m
$array[$i][2] = $aTemp[$i][0]
$array[$i][3] = $aTemp[$i][1]
Next
$array[0][0] = $n
$array[0][1] = ""
$array[0][2] = $m
$array[0][3] = ""
EndSwitch
_SQLite_Close()
_SQLite_Shutdown()
Return $array
EndFunc
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 11:44
par ricky
Hello,
merci pour le partage, mais j'ai une question, ça compare juste la taille ou aussi le contenu?
Merci d'avance
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 12:06
par Tlem
@ricky
mikell a écrit :récupérer l'index et le contenu des lignes différentes
C'est pourtant bien expliqué !!!
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 12:09
par mikell
Moui...
C'est fait spécifiquement pour récupérer des informations plus précises sur les différences de contenu
Pour comparer les tailles, il suffit d'utiliser FileGetSize pour les fichiers et une comparaison d'UBound pour les arrays
NB : un test de la fonction le montre de suite ^^
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 12:15
par ricky
Qui dit récupérer le contenu, ne dit pas forcément le comparer.
Merci pour les informations
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 21:35
par Tlem

Heuuu, vous avez lu le titre de ce sujet ?
[Func] ArrayCompare avec récupération des lignes différentes
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 21:53
par gjmarc
Bonjour,
Merci pour la fonction.
J'ai rencontré une erreur sur la fin des lignes :
_SQLite_GetTable2d(-1, "SELECT * FROM table1 WHERE items1 NOT IN (SELECT items2 FROM table2) ;", $array, 0, 0)
que j'ai remplacées par :
_SQLite_GetTable2d(-1, "SELECT * FROM table1 WHERE items1 NOT IN (SELECT items2 FROM table2) ;", $array, $iRows, $iColumns)
bien entendu précédées d'une déclaration :
Local $iRows, $iColumns
Et plus d'erreur.
Est ce la version d'Autoit ?
Pour info Autoit V3.3.10.2 sur XP
Un spécial j'aime pour cette syntaxe "Local $s = ($n > $m) ? $n : $m"
JMG (premier post)
Re: [Func] ArrayCompare avec récupération des lignes différe
Posté : lun. 27 janv. 2014 22:27
par mikell
Bienvenue sur le forum et merci pour la remarque (1er post édité)
Et non, c'est pas la faute d'Autoit, c'est la faute du chat qui s'est encore fait avoir - par pure flemme - avec des paramètres en ByRef
D'ailleurs faudrait ben que je fasse la gestion d'erreur, aussi ...
NB : Cette syntaxe "Local $s = ($n > $m) ? $n : $m" ne marche que sur les versions Autoit 3.3.10+