Code : Tout sélectionner
#include <Array.au3>
Dim $aArray1[501][51]
Dim $Resultat[11][3] = [["Traitement", "_ArrayDeleteLines", "_ArrayDeleteRows"], _
["Sans ligne vide"], _
["Sans cellule vide Col 3"], _
["Sans 2 dans Col 45"], _
["sans ligne avec 25"], _
["sans ligne avec 25 ou vide"], _
["Sans ligne avec 25 ou 17"], _
["Sans ligne avec 5 (simple)"], _
["Sans ligne avec 5 (fullstring)"], _
[""], _
["Timer"]]
For $i = 0 To 500
Local $Rnd = Random(1, 10, 1)
For $j = 0 To 50
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 pour le test
$aArray2 = $aArray1
;_ArrayDisplay($aArray1, "Tableau à traiter :")
;==========================================
$begin1 = Timerinit()
;Func _ArrayDeleteLines(ByRef $avArray, $sString = "", $iFlag = 0, $iRow = -1)
_ArrayDeleteLines($aArray1)
$Resultat[1][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteLines($aArray1, "", 0, 3)
$Resultat[2][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteLines($aArray1, "2", 0, 45)
$Resultat[3][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteLines($aArray1, "25")
$Resultat[4][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
;_ArrayDeleteLines($aArray1, ";25")
$Resultat[5][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
;_ArrayDeleteLines($aArray1, "25;17")
$Resultat[6][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteLines($aArray1, "5")
$Resultat[7][1] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteLines($aArray1, "5", 1)
$Resultat[8][1] = UBound($aArray1) - 1
$Resultat[10][1] = Round(TimerDiff($begin1), 4)
;==============================================
$begin2 = Timerinit()
; Func _ArrayDeleteRows(ByRef $_array, $_string = "", $_str_col = -1, $_fullstring = 0, $_delim = "|")
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1)
$Resultat[1][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "", 3)
$Resultat[2][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "2", 45)
$Resultat[3][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "25")
$Resultat[4][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "|25")
$Resultat[5][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "25|17")
$Resultat[6][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "5")
$Resultat[7][2] = UBound($aArray1) - 1
$aArray1 = $aArray2
_ArrayDeleteRows($aArray1, "5", -1, 1)
$Resultat[8][2] = UBound($aArray1) - 1
$Resultat[10][2] = Round(TimerDiff($begin2), 4)
_ArrayDisplay($Resultat, "Elements retournés")
;==========================================================
Func _ArrayDeleteLines(ByRef $avArray, $sString = "", $iFlag = 0, $iRow = -1)
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
If $iFlag <> 1 Then $iFlag = 0
If $iRow > -1 Then
$iRow = $iRow
Else
$iRow = -1
EndIf
Local $aString = StringSplit($sString, ";")
Local $fired = 0, $iFlagRow = $iRow, $iLine
; Dimension checking
Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1)
If $iDimension > 2 Then Return SetError(2, 0, 0)
Switch $iDimension
Case 1 ; 1D array
Local $aArrayTmp[UBound($avArray)]
For $k = 1 To $aString[0] ; String to search
For $i = 0 To UBound($avArray) - 1
Switch $iFlag
Case 0 ; Line contain value
If StringInStr($avArray[$i], $aString[$k]) Then ; If line value contain $sString value
$fired += 1
ContinueLoop 2; Nextline (loop $i)
EndIf
Case 1 ; Exact match
If $avArray[$i] = $aString[$k] Then ; If line value is equal to $sString value
$fired += 1
ContinueLoop 2 ; next line (loop $i)
EndIf
EndSwitch
Next
$aArrayTmp[$i - $fired] = $avArray[$i]
Next
; In case of all lines deleted
If UBound($avArray) - $fired < 1 Then
ReDim $aArrayTmp[1]
Else
ReDim $aArrayTmp[UBound($avArray) - $fired]
EndIf
Case 2 ; 2D array
Local $cols = UBound($avArray, 2)
Local $aArrayTmp[UBound($avArray)][$cols]
For $k = 1 To $aString[0] ; String to search
If StringLen($aString[$k]) = 0 And $iRow = -1 Then $iFlag = -1 ; Blank line
For $i = 0 To UBound($avArray) - 1 ; Count lines
Switch $iFlag
Case -1 ; Delete blank line
$iLine = ""
For $j = 0 To $cols - 1 ; Count rows
$iLine &= $avArray[$i][$j] ; Concatenate all rows and strip all spaces.
Next
If StringLen(StringStripWS($iLine, 8)) = 0 Then ; If line is blank line
$fired += 1
ContinueLoop 1 ; Nextline (loop $i)
EndIf
Case 0 ; Search value(s) in each row
For $j = 0 To $cols - 1 ; Count rows
$iLine &= StringStripWS($avArray[$i][$j], 1)
If $iRow = -1 Then $iFlagRow = $j ; For specified row
If StringInStr($avArray[$i][$j], $aString[$k]) And $iFlagRow = $j Then ; If row values contain $sString value
$fired += 1
ContinueLoop 2 ; Nextline (loop $i)
EndIf
Next
Case 1 ; Search exact match value(s) in each row
For $j = 0 To $cols - 1 ; Count rows
If $iRow = -1 Then $iFlagRow = $j ; For specified row
If $avArray[$i][$j] = $aString[$k] And $iFlagRow = $j Then ; If row values is equal to $sString value
$fired += 1
ContinueLoop 2 ; next line (loop $i)
EndIf
Next
EndSwitch
For $j = 0 To $cols - 1
$aArrayTmp[$i - $fired][$j] = $avArray[$i][$j]
Next
Next
Next
; In case of all lines deleted
If $iUBound - $fired < 1 Then
ReDim $aArrayTmp[1][1]
Else
ReDim $aArrayTmp[$iUBound - $fired][$cols]
EndIf
EndSwitch
; Check and update elements number
If $iDimension > 1 Then
If $aArrayTmp[0][0] = $iUBound Then
$aArrayTmp[0][0] = UBound($aArrayTmp, 1) - 1
EndIf
Else
If $aArrayTmp[0] = $iUBound Then
$aArrayTmp[0] = UBound($aArrayTmp, 1) - 1
EndIf
EndIf
$avArray = $aArrayTmp
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)
Switch $dims
Case 1 ; array 1D
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
ReDim $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 $_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
ReDim $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 StringRegExpReplace($_text, '\||\s', "") = "" Then Return 1
Else
If $t_fullstring = 1 Then
If StringInStr($_text, "|" & $ts_string[$i] & "|") Then Return 1
Else
If StringInStr($_text, $ts_string[$i]) Then Return 1 ; gère aussi les blancs
EndIf
EndIf
Next
EndFunc ;==>_TestRow