Что нового

Массивы Как удалить из массива строки содержащиеся в файле?

tar

Новичок
Сообщения
58
Репутация
0
Здравствуйте, В массив $aResult записаны ссылки, файл hyt.txt содержит ссылки построчно. Подскажите, как удалить из массива ссылки которые есть в файле.
Код:
$oLinks = _IELinkGetCollection($oIE)

;For $i = 0 To 1
  For $oLink in $oLinks
    If StringInStr($oLink.href, $sMyString) Then
        $aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
    EndIf
  Next
_ArrayDisplay($aResult)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
Local $ahref = FileReadToArray('hit.txt')
Local $shref = '', $nS = 0
For $oLink In $oLinks
    If StringInStr($oLink.href, $sMyString) Then
        For $i = 0 To UBound($ahref) - 1
            If $oLink.href = $ahref[$i] Then $nS = 1
            ExitLoop
        Next
        If $nS Then
            $nS = 0
        Else
            $shref &= $oLink.href & '|'
        EndIf
    EndIf
Next
$shref = StringTrimRight($shref, 1)
$aResult = StringSplit($shref, '|', 1)
_ArrayDisplay($aResult)
 
Последнее редактирование:
  • Like
Реакции: tar

hedji

Продвинутый
Сообщения
409
Репутация
94
Код:
#include <Array.au3>
$oLinks = _IELinkGetCollection($oIE)

$hyt_arr=FileReadToArray("hyt.txt") ;читаем файл в массив

;For $i = 0 To 1
  For $oLink in $oLinks
    If StringInStr($oLink.href, $sMyString) Then
        $aResult[0] = UBound($aResult)
        If _ArraySearch($hyt_arr, $oLink.href) = -1 Then ;если значение не найдено в файле, добавляем его в массив $aResult
            _ArrayAdd($aResult, $oLink.href)
        EndIf
    EndIf
  Next
_ArrayDisplay($aResult)

;вариант с удалением
For $i=0 To UBound($hyt_arr)-1
    $ind = _ArraySearch($aResult, $hyt_arr[$i])
    If $ind <> -1 Then
        _ArrayDelete($aResult, $ind)
    EndIf
Next
 
  • Like
Реакции: tar

Soderling

Новичок
Сообщения
29
Репутация
0
Доброго времени суток! помогите с вышеупомянутым кодом.

Нужно сделать, что бы из массива $aResult удалялись частичные совпадения которые указаны в массиве $A_MASKA

ПРИМЕР:

Код:
GLOBAL $A_RESULT[0]
GLOBAL $A_MASKA[0]

_ArrayAdd($A_RESULT, "1111.jpg",""," ")
_ArrayAdd($A_RESULT, "1111.@",""," ")
_ArrayAdd($A_RESULT, "1111",""," ")

_ArrayAdd($A_MASKA, ".jpg",""," ")
_ArrayAdd($A_MASKA, ".@",""," ")

For $i=0 To UBound($A_MASKA)-1
   $ind = _ArraySearch($A_RESULT, $A_MASKA[$i]) ; тут нужно сделать, что бы например: "1111.jpg = .jpg"
   If $ind <> -1 Then
       _ArrayDelete($A_RESULT, $ind) ; и соответственно если "1111.jpg = .jpg" , то удалить строку
   EndIf
Next

_ArrayDisplay($A_RESULT)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
;~     ...
$ind = _ArraySearch($A_RESULT, $A_MASKA[$i], 0, 0, 0, 1) ; тут нужно сделать, что бы например: "1111.jpg = .jpg"
;~     ...
 

Soderling

Новичок
Сообщения
29
Репутация
0
Код:
;~     ...
$ind = _ArraySearch($A_RESULT, $A_MASKA[$i], 0, 0, 0, 1) ; тут нужно сделать, что бы например: "1111.jpg = .jpg"
;~     ...

Работает! огромное спасибо
Сообщение автоматически объединено:

Столкнулся с новой проблемой. Если руками, для теста, заполнить массив как в примере, тогда массив чистится без проблем. Однако, если получаю ссылки в массив через библиотеку UIAUTOMATE.au3, то массив не получается почистить.

Код:
;==============================================================
   ; ПОЛУЧИЛИ ВСЕ ПОДРЯД ССЫЛКИ В МАССИВ $A_PARSER_SITE_no_uniq[0]
   ;==============================================================
   
   Global $A_PARSER_SITE_no_uniq[0]
   
   $All = _UIA_FindAllElements($oParent) 
   For $i = 1 to $All[0]
      If _UIA_ElementGetPropertyValue($All[$i], "LocalizedControlType") = "ссылка" Then
         _ArrayAdd($A_PARSER_SITE_no_uniq, _UIA_ElementGetPropertyValue($All[$i], "Value.Value"),""," ")
      Endif
   Next  

   ;==============================================================
   ; ЧИСТИМ МАССИВ ПО МАСКЕ
   ;==============================================================

GLOBAL $A_MASKA[0]
_ArrayAdd($A_MASKA, "yandex",""," ")  ;  для проверки
For $i=0 To UBound($A_MASKA)-1
   $ind = _ArraySearch($A_PARSER_SITE_no_uniq, $A_MASKA[$i],0,0,0,1) 
   If $ind <> -1 Then
       _ArrayDelete($A_PARSER_SITE_no_uniq, $ind) 
   EndIf
Next
   
  _ArrayDisplay($A_PARSER_SITE_no_uniq) ; на выходе массив без изменений, все ссылки содержащие yandex на месте

Сообщение автоматически объединено:

Работает! огромное спасибо
Сообщение автоматически объединено:

Столкнулся с новой проблемой. Если руками, для теста, заполнить массив как в примере, тогда массив чистится без проблем. Однако, если получаю ссылки в массив через библиотеку UIAUTOMATE.au3, то массив не получается почистить.

Код:
;==============================================================
   ; ПОЛУЧИЛИ ВСЕ ПОДРЯД ССЫЛКИ В МАССИВ $A_PARSER_SITE_no_uniq[0]
   ;==============================================================
  
   Global $A_PARSER_SITE_no_uniq[0]
  
   $All = _UIA_FindAllElements($oParent)
   For $i = 1 to $All[0]
      If _UIA_ElementGetPropertyValue($All[$i], "LocalizedControlType") = "ссылка" Then
         _ArrayAdd($A_PARSER_SITE_no_uniq, _UIA_ElementGetPropertyValue($All[$i], "Value.Value"),""," ")
      Endif
   Next 

   ;==============================================================
   ; ЧИСТИМ МАССИВ ПО МАСКЕ
   ;==============================================================

GLOBAL $A_MASKA[0]
_ArrayAdd($A_MASKA, "yandex",""," ")  ;  для проверки
For $i=0 To UBound($A_MASKA)-1
   $ind = _ArraySearch($A_PARSER_SITE_no_uniq, $A_MASKA[$i],0,0,0,1)
   If $ind <> -1 Then
       _ArrayDelete($A_PARSER_SITE_no_uniq, $ind)
   EndIf
Next
  
  _ArrayDisplay($A_PARSER_SITE_no_uniq) ; на выходе массив без изменений, все ссылки содержащие yandex на месте

Так же если в $A_PARSER_SITE_no_uniq добавить новые строки "yandex" , "yandex.ru", после того как массив заполнился ссылками с сайта - они так же не удаляются
Сообщение автоматически объединено:

невнимателен был, удаляется 1 строка. Я так понимаю зациклить надо. Но как правильно это сделать?
Сообщение автоматически объединено:

Возможно я не совсем точно сформулировал вопрос. Нужно что бы все значения массива $A_MASKA были удалены из массива $A_PARSER_SITE_no_uniq.
в текущем варианте удаляется только по 1 совпадению.
Сообщение автоматически объединено:

Решил вопрос циклом While Wend
Знаете, как лучше сделать, поделитесь пожалуйста
Код:
For $i=0 To UBound($A_MASKA)-1
  while 1
   $ind = _ArraySearch($A_PARSER_SITE_no_uniq, $A_MASKA[$i],0,0,0,1) 
      If $ind <> -1 Then
         _ArrayDelete($A_PARSER_SITE_no_uniq, $ind) 
      else
         exitLoop
      endif 
   Wend
Next
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Я не знаю что вы автоматизируете, но если вам нужно получить список уникальных ссылок отфильтрованных по маске, думаю такой пример подойдет.
Код:
#include <Array.au3>
#include <UIAutomate\UIAutomate.au3> ; установите свой путь к библиотеке

example()

Func example()
    Opt('WinTitleMatchMode', 2)
    Local $hWnd = WinWait('- Google Chrome', '', 5) ; замените на запуск своего браузера/окна
    If Not $hWnd Then Exit MsgBox(0, Default, 'Окно " - Google Chrome" не найдено')

    WinActivate($hWnd)
    Local $oParent = _UIA_GetElementFromHandle($hWnd)

    Local $aMask[] = ['.jpg', 'yandex', '.@']
    Local $aUrls = getUrls($oParent, $aMask)
    _ArrayDisplay($aUrls)
EndFunc   ;==>example

Func getUrls($oParent, Const ByRef $aMask)
    Local $aAll = _UIA_FindAllElements($oParent, $UIA_ControlTypePropertyId, $UIA_HyperlinkControlTypeId)
    If @error Then Return

    Local $iCount = UBound($aMask) - 1
    Local $oDict = ObjCreate('Scripting.Dictionary')
    Local $sValue
    For $i = 1 To $aAll[0]
        $sValue = _UIA_ElementGetPropertyValue($aAll[$i], $UIA_ValueValuePropertyId)
        If $sValue Then
            For $j = 0 To $iCount
                If StringInStr($sValue, $aMask[$j]) Then ContinueLoop 2
            Next
            $oDict.Item($sValue)
        EndIf
    Next
    Return $oDict.Keys
EndFunc   ;==>getUrls
 
Последнее редактирование:

Soderling

Новичок
Сообщения
29
Репутация
0
Я не знаю что вы автоматизируете, но если вам нужно получить список уникальных ссылок отфильтрованных по маске, думаю такой пример подойдет.
Код:
#include <Array.au3>
#include <UIAutomate\UIAutomate.au3> ; установите свой путь к библиотеке

example()

Func example()
    Opt('WinTitleMatchMode', 2)
    Local $hWnd = WinWait('- Google Chrome', '', 5) ; замените на запуск своего браузера/окна
    If Not $hWnd Then Exit MsgBox(0, Default, 'Окно " - Google Chrome" не найдено')

    WinActivate($hWnd)
    Local $oParent = _UIA_GetElementFromHandle($hWnd)

    Local $aMask[] = ['.jpg', 'yandex', '.@']
    Local $aUrls = getUrls($oParent, $aMask)
    _ArrayDisplay($aUrls)
EndFunc   ;==>example

Func getUrls($oParent, Const ByRef $aMask)
    Local $aAll = _UIA_FindAllElements($oParent, $UIA_ControlTypePropertyId, $UIA_HyperlinkControlTypeId)
    If @error Then Return

    Local $iCount = UBound($aMask) - 1
    Local $oDict = ObjCreate('Scripting.Dictionary')
    Local $sValue
    For $i = 1 To $aAll[0]
        $sValue = _UIA_ElementGetPropertyValue($aAll[$i], $UIA_ValueValuePropertyId)
        If $sValue Then
            For $j = 0 To $iCount
                If StringInStr($sValue, $aMask[$j]) Then ContinueLoop 2
            Next
            $oDict.Item($sValue)
        EndIf
    Next
    Return $oDict.Keys
EndFunc   ;==>getUrls
Благодарю. Буду разбираться, как работает ваш пример)) я только учусь))
 
Верх