#include Global $Hauteur = 500 Global $Largeur = 50 Global $aArray1, $aArray2 Global $Resultat[12][5] = [["Traitement", "_ArrayDeleteLines", "Durée d'exécution", "_ArrayDeleteRows", "Durée d'exécution"], _ ["Sans ligne vide"], _ ["Sans vide Col 3"], _ ["Sans 2 Col 5"], _ ["sans ligne avec 25"], _ ["sans ligne avec 25 ou vide"], _ ["sans ligne avec case 25 ou case vide"], _ ["Sans ligne avec 25 ou 17"], _ ["Sans ligne avec 5"], _ ["Sans case vide"], _ [""], _ ["Total"]] ;========================================== _1D() ;_ArrayDisplay($aArray1, "Tableau à traiter :") Test_ArrayDeleteLines() Test_ArrayDeleteRows() _ArrayDisplay($Resultat, "Test 1D - Elements retournés") _2D() ;_ArrayDisplay($aArray1, "Tableau à traiter :") Test_ArrayDeleteLines() Test_ArrayDeleteRows() _ArrayDisplay($Resultat, "Test 2D - Elements retournés") ;============================================== Func _1D() Dim $aArray1[$Hauteur + 1] For $i = 0 To $Hauteur Local $Rnd = Random(1, 10, 1) If $Rnd <> 5 Then $aArray1[$i] = Random(1, 100, 1) Else $aArray1[$i] = "" EndIf Next $aArray2 = $aArray1 EndFunc ;==>_1D Func _2D() Dim $aArray1[$Hauteur + 1][$Largeur + 1] For $i = 0 To $Hauteur Local $Rnd = Random(1, 10, 1) For $j = 0 To $Largeur If $Rnd <> 5 Then $aArray1[$i][$j] = Random(1, 100, 1) Else $aArray1[$i][$j] = "" EndIf Next Next $aArray1[3][3] = "" ; on vide la case 3x3 $aArray2 = $aArray1 EndFunc ;==>_2D Func Test_ArrayDeleteLines() ;Func _ArrayDeleteLines(ByRef $avArray, $sString = "", $iFlag = 0, $iRow = -1) $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1) $Resultat[1][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[1][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "", 1, 3) $Resultat[2][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[2][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "2", 0, 5) $Resultat[3][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[3][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "25", 1) $Resultat[4][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[4][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, ";25") $Resultat[5][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[5][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, ";25", 1) $Resultat[6][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[6][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "25;17") $Resultat[7][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[7][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "5") $Resultat[8][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[8][1] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin1 = TimerInit() _ArrayDeleteLines($aArray1, "", 1) $Resultat[9][2] = Round(TimerDiff($begin1) / 1000, 4) $Resultat[9][1] = UBound($aArray1) - 1 For $i = 1 To 10 $Resultat[11][2] += $Resultat[$i][2] Next $Resultat[11][2] = Round($Resultat[11][2], 2) & " s" EndFunc ;==>Test_ArrayDeleteLines Func Test_ArrayDeleteRows() ; Func _ArrayDeleteRows(ByRef $_array, $_string = "", $_str_col = -1, $_fullstring = 0, $_delim = "|") $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1) $Resultat[1][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[1][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "", 3) $Resultat[2][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[2][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "2", 5) $Resultat[3][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[3][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "25", -1, 1) $Resultat[4][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[4][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "|25") $Resultat[5][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[5][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "|25", -1, 1) $Resultat[6][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[6][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "25|17") $Resultat[7][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[7][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "5") $Resultat[8][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[8][3] = UBound($aArray1) - 1 $aArray1 = $aArray2 $begin2 = TimerInit() _ArrayDeleteRows($aArray1, "", -1, 1) $Resultat[9][4] = Round(TimerDiff($begin2) / 1000, 4) $Resultat[9][3] = UBound($aArray1) - 1 For $i = 1 To 10 $Resultat[11][4] += $Resultat[$i][4] Next $Resultat[11][4] = Round($Resultat[11][4], 2) & " s" EndFunc ;==>Test_ArrayDeleteRows ;_ArrayDeleteLines() Version 5 Func _ArrayDeleteLines(ByRef $avArray, $sString = "", $iFlag = 0, $iRow = -1) ; Dimension checking Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) If Not IsArray($avArray) Or $iDimension > 2 Then Return SetError(1, 0, 0) Local $fired = 0, $iFlagRow = $iRow, $iLine If $iFlag <> 1 Then $iFlag = 0 If $iRow < -1 Then $iRow = -1 ; For multiple search Local $aString = StringSplit($sString, ";") Local $iString = UBound($aString) - 1 ; Dimension of array string If $iString > 1 Then For $i = 1 To $iString ; Array string loop _ArrayDeleteLines($avArray, $aString[$i], $iFlag, $iRow) Next Return 1 EndIf Switch $iDimension Case 1 ; 1D array For $i = 0 To UBound($avArray) - 1 ; Lines loop Switch $iFlag ; Type of search Case 0 ; Line contain value If StringInStr($avArray[$i], $sString) Or $avArray[$i] = $sString Then ; If line value contain $sString value $fired += 1 ContinueLoop ; Nextline (loop $i) EndIf Case 1 ; Exact match If $avArray[$i] = $sString Then ; If line value is equal to $sString value $fired += 1 ContinueLoop ; next line (loop $i) EndIf EndSwitch $avArray[$i - $fired] = $avArray[$i] ; Move datas of $Line($i) to $Line($i - $fired) Next ; In case of all lines deleted If $iUBound - $fired < 1 Then Dim $avArray[1] Else ReDim $avArray[$iUBound - $fired] EndIf Case 2 ; 2D array Local $iCols = UBound($avArray, 2) If $iRow > $iCols Then Return SetError(3) ; $iRow is greater than max rows value then return. For $i = 0 To UBound($avArray) - 1 ; Count lines Switch $iFlag ; Type of search Case 0 ; Search value in row(s) If $iRow > -1 Then ; If Row is determined If StringInStr($avArray[$i][$iRow], $sString) Then ; If row value contain $sString value $fired += 1 ContinueLoop 1 ; next line (loop $i) EndIf Else $iLine = "" For $j = 0 To $iCols - 1 $iLine &= $avArray[$i][$j] & "|" ; Concatenate all rows. Next If StringInStr($iLine, $sString) Or $sString = StringStripWS(StringReplace($iLine, "|", ""), 8) Then ; If row values contain $sString value $fired += 1 ContinueLoop 1 ; Nextline (loop $i) EndIf EndIf Case 1 ; Search exact match value(s) in each row(s) If $iRow > -1 Then ; If Row is determined If $avArray[$i][$iRow] = $sString Then ; If row value is equal to $sString value $fired += 1 ContinueLoop 1 ; next line (loop $i) EndIf Else For $j = 0 To $iCols - 1 ; Row loop If $avArray[$i][$j] = $sString Then ; If row values is equal to $sString value $fired += 1 ContinueLoop 2 ; next line (loop $i) EndIf Next EndIf EndSwitch ; Move datas of $Line($i) to $Line($i - $fired) For $j = 0 To $iCols - 1 $avArray[$i - $fired][$j] = $avArray[$i][$j] Next Next ; In case of all lines deleted If $iUBound - $fired < 1 Then Dim $avArray[1][1] Else ReDim $avArray[$iUBound - $fired][$iCols] EndIf EndSwitch Return 1 EndFunc ;==>_ArrayDeleteLines ;=========================================================== Func _ArrayDeleteRows(ByRef $_array, $_string = "", $_str_col = -1, $_fullstring = 0, $_delim = "|") Local $dims = UBound($_array, 0), $fired = 0 If Not IsArray($_array) Or $dims > 2 Then Return SetError(1, 0, 0) If $_fullstring <> 0 and $_fullstring <> 1 Then Return SetError(2, 0, 0) If StringRegExp($_delim, '\w+') Then Return SetError(3, 0, 0) ; interdit lettre, chiffre ou _ comme délimiteur Switch $dims Case 1 ; array 1D $_str_col = -1 Local $temp[UBound($_array)] For $i = 0 To UBound($_array) - 1 $row = $_array[$i] If _TestRow($row, $_string, $_fullstring, $_delim) Then ; teste la ligne $fired += 1 ContinueLoop ; passe à la ligne suivante EndIf $temp[$i - $fired] = $_array[$i] Next If UBound($_array) - $fired < 1 Then Dim $temp[1] Else ReDim $temp[UBound($_array) - $fired] EndIf Case 2 ; array 2D Local $cols = UBound($_array, 2), $row = "" If $_str_col < -1 Or $_str_col > $cols - 1 Then Return SetError(4, 0, 0) ; $_str_col = -1 Local $temp[UBound($_array)][$cols] For $i = 0 To UBound($_array) - 1 ; parcourt les lignes $row = "|" If $_str_col = -1 Then For $j = 0 To $cols - 1 $row &= $_array[$i][$j] & "|" ; concatène la ligne avec des séparateurs Next Else $row = $_array[$i][$_str_col] & "|" ; cellule de colonne EndIf If _TestRow($row, $_string, $_fullstring, $_delim) Then ; teste la ligne ou la cellule $fired += 1 ContinueLoop ; passe à la ligne suivante EndIf For $j = 0 To $cols - 1 $temp[$i - $fired][$j] = $_array[$i][$j] Next Next If UBound($_array) - $fired < 1 Then Dim $temp[1][$cols] Else ReDim $temp[UBound($_array) - $fired][$cols] EndIf EndSwitch $_array = $temp $temp = "" Return 1 EndFunc ;==>_ArrayDeleteRows ; INTERNAL USE ONLY =============== Func _TestRow($_text, $s_string, $t_fullstring, $t_delim) $ts_string = StringSplit($s_string, $t_delim) For $i = 1 To $ts_string[0] If $ts_string[$i] = "" Then If $t_fullstring = 1 Then If StringInStr($_text, "||") Then Return 1 ; teste si case vide Else If StringRegExpReplace($_text, '\||\s', "") = "" Then Return 1 ; teste si ligne vide EndIf Else If $t_fullstring = 1 Then If StringInStr($_text, "|" & $ts_string[$i] & "|") Then Return 1 ; teste si case avec la string fullstring Else If StringInStr($_text, $ts_string[$i]) Then Return 1 ; teste si ligne avec la string EndIf EndIf Next EndFunc ;==>_TestRow