Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как сравнить два массива не построчно,а целиком?

Ответить
Настройки темы
[решено] Как сравнить два массива не построчно,а целиком?

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: pekich
Дата: 02-11-2010
Пожалуйста подскажите в каком направлении двигаться, или помогите написать скрипт.
Всем ответившим спасибо за советы и помощь.
Дано:
a) файл Compare.ini , например:
[HG]
1 = Q
2 = G
3 = N
b) образец-шаблон Sample.ini для сравнения , например:
[JK]
1 = Q
2 = Q
3 = Q
Задача:
1. Сравнить содержание Compare.ini с заданным образцом Sample.ini : НазваниеРазделов/Ключи/Значения.
2. При совпадении значений строк Compare.ini и Sample.ini ,выводится сообщение: "Все три строки совпали" ,
т.е. сообщение должно выводится не каждый раз при совпадении,а один раз при совпадении строк три раза,в данном случае;
3. При первом несовпадении работа скрипта завершается.

Начало написал,концовку додумать немогу:

Код: Выделить весь код
#include <File.au3>
#include <Array.au3>

Local $aCompare,$aSample[5]

$aSample[1] = "[JK]"  ; первая строка образца
$aSample[2] = "1=Q"  ; вторая строка образца
$aSample[3] = "2=Q"  ; третья строка образца
$aSample[4] = "3=Q"  ; четвертая строка образца

$compare = "Compare.ini" ; присвоили переменную

_FileReadToArray($compare, $aCompare) ; считали значения строк Compare.ini в массив

For $i = 1 To UBound($aCompare) - 1
    $error2 = _ArraySearch($aSample,$aCompare[$i])

If $error2 = -1 Then

MsgBox(48, $compare & " строка " & $i, "Данные файла " & $aSample & " в строке № " & $i & " не совпадают", 2); несовпадение массива
Exit (0)

Else
        MsgBox(64, $compare & " строка " & $i, "Данные файла " & $aSample & " в строке № " & $i & " совпадают", 2);здесь совпадение массива

      EndIf
Next

Отправлено: 22:20, 01-11-2010

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Предупреждение за нарушение правил форума, пункт 2.7:

Цитата:
В заголовке темы обязательно обозначайте название предмета, которого касается вопрос, а в теле сообщения максимально подробно опишите проблему (приведите аппаратную/программную конфигурацию, а также изложите ситуацию, в которой возникает проблема). Темы с несодержательными или слишком общими заголовками будут закрываться или переноситься в раздел "Зона тестирования" в зависимости от политики конкретного форума. Подробнее о принципах создания тем читайте в этом документе и Правилах форумов.
Переименуйте пожалуйста тему.




И ещё, код нужно заключать в теги code, а раскрашивать можно утилитой Au3ToPost.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 23:45, 01-11-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Исправлю

Отправлено: 00:30, 02-11-2010 | #3


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата pekich:
Задача »
Примерно так:

Код: Выделить весь код
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"

$aCompare_Sect = IniReadSection($sCompare_File, "HG")
$aSample_Sect = IniReadSection($sSample_File, "HG")

$iComp_Ubound =  UBound($aCompare_Sect) - 1
$iSamp_Ubound =  UBound($aSample_Sect) - 1

If $iComp_Ubound <> $iSamp_Ubound Or $iComp_Ubound <= 0 Then
    MsgBox(48, $sCompare_File, "Данные файла [" & $sSample_File & "] не совпадают", 2); несовпадение массива
    Exit
EndIf

For $i = 1 To $iComp_Ubound
    If $aCompare_Sect[$i][0] & $aCompare_Sect[$i][1] = $aSample_Sect[$i][0] & $aSample_Sect[$i][1] Then
        MsgBox(64, $sCompare_File & " строка " & $i+1, "Данные файла [" & $sSample_File & "] в строке №" & $i+1 & " совпадают", 2)
    Else
        MsgBox(48, $sCompare_File & " строка " & $i+1, "Данные файла [" & $sSample_File & "] в строке №" & $i+1 & " не совпадают", 2)
        Exit
    EndIf
Next

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 01:39, 02-11-2010 | #4


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Вот вариант без построчной обработки массива :
Код: Выделить весь код
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"

$sSectNameSample_File="JK"
$sSectNameCompare_File="HG"

$sSample_FileText=FileRead($sSample_File)
$sCompare_FileText=FileRead($sCompare_File)

$aSample_SectText= StringRegExp($sSample_FileText,"(?s).*\[" & $sSectNameSample_File & "\]\r\n(.+?)\[.*",1)
$aCompare_SectText= StringRegExp($sCompare_FileText,"(?s).*\[" & $sSectNameCompare_File & "\]\r\n(.+?)\[.*",1)

If $aSample_SectText[0] = $aCompare_SectText[0] Then
    $sInfoText="Все три строки совпали"
Else
    $sInfoText="Данные секций  НЕ совпадают"
EndIf

MsgBox(64, "Info" ,$sInfoText)

Последний раз редактировалось gregaz, 02-11-2010 в 11:35.


Отправлено: 06:42, 02-11-2010 | #5


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Возможен вариант с использованием ф-ии : _ArrayEx.au3 см. Multidimensional array to string and back

Код: Выделить весь код
#include "_ArrayEx.au3"
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"

$aCompare_Sect = IniReadSection($sCompare_File, "HG")
$aSample_Sect = IniReadSection($sSample_File, "JK")
$sSample_SectText=_ArrayToStringEx($aSample_Sect, "|")
$sCompare_SectText=_ArrayToStringEx($aCompare_Sect, "|")
If $sSample_SectText = $sCompare_SectText Then
    $sInfoText="Данные секций  совпадают"
Else
    $sInfoText="Данные секций  НЕ совпадают"
EndIf

MsgBox(64, "Info" ,$sInfoText)
но он работает на порядок медленнее

Последний раз редактировалось gregaz, 02-11-2010 в 11:49.

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:16, 02-11-2010 | #6


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за оперативность, мне тоже интересен вариант сравнения из двух файлов *.ini .
Видимо несовсем понятно объяснил ,что мне нужно,уточню.

Мой код и Ваш работает так ,при успехе:
1. Сравнивается первая строка обоих *.ini >вывод сообщения о совпадении ;
2. Сравнивается вторая строка обоих *.ini >вывод сообщения о совпадении ;
3. Сравнивается третья строка обоих *.ini >вывод сообщения о совпадении ;
4. Сравнивается четвертая строка обоих *.ini>вывод сообщения о совпадении ;
5. Завершение работы скрипта.

Мне нужно так ,при успехе:
1. Сравнивается первая строка обоих *.ini ;
2. Сравнивается вторая строка обоих *.ini ;
3. Сравнивается третья строка обоих *.ini ;
4. Сравнивается четвертая строка обоих *.ini ;
5. Вывод сообщения,что все четыре строки в *.ini файлах совпали ;
6. Завершение работы скрипта.

Отправлено: 10:24, 02-11-2010 | #7


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата pekich:
Видимо несовсем понятно объяснил ,что мне нужно,уточню. »
Ничего-себе уточнил :

Как тема называется ? разве не так : "Как сравнить два массива не построчно,а целиком?"

И зачем тогда сравнивать построчно

Если тексты всей секции равны , то наверное и каждая строка равна , или я что-то не понимаю

Последний раз редактировалось gregaz, 02-11-2010 в 14:49.


Отправлено: 12:02, 02-11-2010 | #8


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата gregaz:
Ошибаешься мой код выдает только 1 сообщение при полном успехе »
Он говорил про мой код, ибо когда он написал своё сообщение, твои два сообщения были пустые

Цитата pekich:
Мне нужно так ,при успехе »
Код: Выделить весь код
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"

$aCompare_Sect = IniReadSection($sCompare_File, "HG")
$aSample_Sect = IniReadSection($sSample_File, "HG")

$iComp_Ubound = UBound($aCompare_Sect) - 1
$iSamp_Ubound = UBound($aSample_Sect) - 1

$iUbound = $iComp_Ubound
If $iSamp_Ubound > $iComp_Ubound Then $iUbound = $iSamp_Ubound

If $iComp_Ubound <> $iSamp_Ubound Or $iComp_Ubound <= 0 Then
    MsgBox(48, $sCompare_File, "Данные файла [" & $sSample_File & "] не совпадают", 2); несовпадение массива
    Exit
EndIf

$sCompare = "совпадают"

For $i = 1 To $iUbound
    If $aCompare_Sect[$i][0] & $aCompare_Sect[$i][1] <> $aSample_Sect[$i][0] & $aSample_Sect[$i][1] Then
        $sCompare = "НЕ " & $sCompare
        ExitLoop
    EndIf
Next

MsgBox(64, $sCompare_File, "Данные файла [" & $sSample_File & "] " & $sCompare, 2)
Exit

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 13:23, 02-11-2010 | #9


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сижу, пробую, разбираюсь. Завтра к вечеру отпишусь.

Отправлено: 20:17, 02-11-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как сравнить два массива не построчно,а целиком?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Триггер пробуждения Диспетчера задач nc-media Microsoft Windows 7 3 26-09-2010 20:02
Прочие БД - oracle]FRM-40735: POST-OUERY триггер вызвал необработанное ислючение ORA-01403 Molchun78 Программирование и базы данных 0 08-11-2008 23:07
Счетчик Котяра Вебмастеру 3 03-05-2008 03:59
[MySQL]auto_increment и триггер Kerbit Вебмастеру 11 14-11-2006 21:43
счетчик makcum Вебмастеру 17 07-06-2002 14:24




 
Переход