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

Компьютерный форум 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

 

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


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

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


Небольшой итог.Если где неправ,поправьте.
Коды Creat0R , пост № 4 и № 9 не подходят.
№ 4 -- неустраивает алгоритм отображения MsgBox ;
№ 9 -- неустраивает код для отображения MsgBox.
Cреднее время выполнения скриптов, без MsgBox: 0.20 сек.
Так же в обоих постах не работает часть кода,на быстрое завершение работы скрипта
при несовпадении массивов,а очень бы хотелось.Поправьте.Пожалуйста.
Код: Выделить весь код
If $iComp_Ubound <> $iSamp_Ubound Or $iComp_Ubound <= 0 Then
    MsgBox(48, $sCompare_File, "Данные файла [" & $sSample_File & "] не совпадают", 2); несовпадение массива
    Exit
EndIf
Коды gregaz , пост № 5 и № 6.
Среднее время выполнения всех скриптов, без MsgBox: 0.23 сек.
Те не на порядок медленнее работают.Или что Вы имели ввиду?
№ 5 -- при устранении ошибки в части кода,убрано[0] ,
скрипт начинает работать,но сравнение не делает.
При любом изменении значений в Compare.ini выдается сообщение:"Все три строки совпали"
Код: Выделить весь код
If $aSample_SectText = $aCompare_SectText Then
    $sInfoText="Все три строки совпали"
Else
    $sInfoText="Данные секций  НЕ совпадают"
EndIf
№ 6 -- работает.
Воспользовался как примером и сделал так:
Код: Выделить весь код
#include <File.au3>
#include <Array.au3>

Local $aCompare,$aSample

$compare = "Compare.ini"
$sample = "Sample.ini"

_FileReadToArray($compare,$aCompare)
_FileReadToArray($sample , $aSample)

$sCompare_SectText = _ArrayToString( $aCompare,"|")
$sSample_SectText =_ArrayToString($aSample, "|")

If $sSample_SectText <> $sCompare_SectText Then
            MsgBox(64, "Info" ,"Данные *.ini файлов НЕ-совпадают",1)
Exit (0)
Else
    MsgBox(48, "Info" ,"Данные *.ini файлов совпадают",1)
Exit (0)
EndIf
PS: пока остановился на варианте поста № 6.

Отправлено: 17:58, 03-11-2010 | #11



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

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


Аватара для Creat0R

Must AutoIt


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

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


pekich,
Вы сначала определитесь с задачей, я последним сообщением полностью сюит с толку.

Цитата pekich:
Воспользовался как примером и сделал так: »
Вы конечно извините, но это бред, зачем превращать строки в массив, потом обратно в строки и проверять их?

Не проще ли так сделать:

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

$sCompare_SectText = FileRead($compare)
$sSample_SectText = FileRead($sample)

If $sCompare_SectText <> $sSample_SectText Then
    MsgBox(64, "Info", "Данные *.ini файлов НЕ-совпадают", 1)
Else
    MsgBox(48, "Info", "Данные *.ini файлов совпадают", 1)
EndIf

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

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

Отправлено: 18:37, 03-11-2010 | #12


Аватара для gregaz

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


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

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


Цитата pekich:
№ 5 -- при устранении ошибки в части кода,убрано[0] ,
скрипт начинает работать,но сравнение не делает.
При любом изменении значений в Compare.ini выдается сообщение:"Все три строки совпали" »
Там нет никакой ошибки.

$aSample_SectText - это массив и для сравнения надо брать значение его первого элемента : ( $aSample_SectText[0] )

При убирании [0] ты пытаешься сравнить сами массивы ( а это есть "" ) . Поэтому и получашь всегда равенство ( "" = "" )"Все три строки совпали"

Если вылезает сообщение об ошибке, значит указанная секция в файле не найдена (отсутствует).

Следовало бы ввести проверку на существование секций с указанными именами , так :

Код: Выделить весь код
If Not IsArray($aSample_SectText) Then 
	$sInfoText="Секция : " & $sSectNameSample_File & "не найдена"
ElseIf Not IsArray($aCompare_SectText) Then 
	$sInfoText="Секция : " & $sSectNameCompare_File & "не найдена"
ElseIf $aSample_SectText[0] = $aCompare_SectText[0] Then
    $sInfoText="Все три строки совпали"
Else
    $sInfoText="Данные секций  НЕ совпадают"
EndIf
MsgBox(64, "Info" ,$sInfoText)

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


Отправлено: 21:54, 03-11-2010 | #13


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


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

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


Вложения
Тип файла: rar Compare.rar
(464 байт, 18 просмотров)

Creat0R
Цитата:
Вы конечно извините, но это бред, зачем превращать строки в массив, потом обратно в строки и проверять их?
Ученье - это преодоление бреда чужого и своего. Общаясь с опытными людьми размер своего бреда уменьшается.
Хоть хелп и на русском ,но даже и с родгого языка приходится переводить.FileRead - ну не обратил внимание.
А,например, UBound - Вернуть размер размерности массива.Когда прочитал, то подумал-бред!
В последствии истолковал так : эта функция преобразует массив в некое единое значение.При том не уверен,что перевел
для себя правильно.
И с задачей я определился с первого поста:необходимо сравнить содержание двух *.ini файлов. А так как проглядел FileRead ,
то пришел к выводу , что нужно сравнивать массивы. Отсюда и заголовок темы. Зато поучился работать с массивами и это гуд.

gregaz
Цитата:
Следовало бы ввести проверку на существование секций с указанными именами , так :
Следовало бы проверять ,прежде чем выкладывать.Пробуйте в прикрепленных файлах.
SciTE сообщает:

If $aSample_SectText[0] = $aCompare_SectText[0] Then
If $aSample_SectText^ ERROR

Большое Всем спасибо за помощь.Живите и процветайте.
Вопрос решен.

Отправлено: 13:55, 04-11-2010 | #14


Аватара для kaster

Старожил


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

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


Цитата pekich:
Хоть хелп и на русском »
парадокс, хелп не на русском, а тот, что на русском не хелп
типа юмор
а теперь серьезно, русская справка настолько устарела, что пользоваться ею, подчас, вредно для кодинга. лучше взять актуальную английскую, и если с языком совсем туго, то использовать разного рода переводчики. не айс, но хоть что-то

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru

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

Отправлено: 23:36, 04-11-2010 | #15



Компьютерный форум 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




 
Переход