Показать полную графическую версию : [решено] Как сравнить два массива не построчно,а целиком?
Пожалуйста подскажите в каком направлении двигаться, или помогите написать скрипт.
Всем ответившим спасибо за советы и помощь.
Дано:
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
Предупреждение за нарушение правил форума, пункт 2.7 (http://forum.oszone.net/rules.html#2.7):
В заголовке темы обязательно обозначайте название предмета, которого касается вопрос, а в теле сообщения максимально подробно опишите проблему (приведите аппаратную/программную конфигурацию, а также изложите ситуацию, в которой возникает проблема). Темы с несодержательными или слишком общими заголовками будут закрываться или переноситься в раздел "Зона тестирования" в зависимости от политики конкретного форума. Подробнее о принципах создания тем читайте в этом документе (http://forum.oszone.net/faq.php?faq=vb_read_and_post#faq_thread) и Правилах форумов.
Переименуйте пожалуйста тему.
[hr]
И ещё, код нужно заключать в теги code, а раскрашивать можно утилитой Au3ToPost (http://creator-lab.ucoz.ru/load/3-1-0-18).
Задача »
Примерно так:
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"
$aCompare_Sect = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sCompare_File, "HG")
$aSample_Sect = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sSample_File, "HG")
$iComp_Ubound = UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aCompare_Sect) - 1
$iSamp_Ubound = UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aSample_Sect) - 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iComp_Ubound <> $iSamp_Ubound Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iComp_Ubound <= 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(48, $sCompare_File, "Данные файла [" & $sSample_File & "] не совпадают", 2); несовпадение массива
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iComp_Ubound
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aCompare_Sect[$i][0] & $aCompare_Sect[$i][1] = $aSample_Sect[$i][0] & $aSample_Sect[$i][1] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, $sCompare_File & " строка " & $i+1, "Данные файла [" & $sSample_File & "] в строке №" & $i+1 & " совпадают", 2)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(48, $sCompare_File & " строка " & $i+1, "Данные файла [" & $sSample_File & "] в строке №" & $i+1 & " не совпадают", 2)
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Вот вариант без построчной обработки массива :
$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)
Возможен вариант с использованием ф-ии : _ArrayEx.au3 см. Multidimensional array to string and back (http://www.autoitscript.com/forum/index.php?showtopic=121529)
#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)
но он работает на порядок медленнее
Спасибо за оперативность, мне тоже интересен вариант сравнения из двух файлов *.ini .
Видимо несовсем понятно объяснил ,что мне нужно,уточню.
Мой код и Ваш работает так ,при успехе:
1. Сравнивается первая строка обоих *.ini >вывод сообщения о совпадении ;
2. Сравнивается вторая строка обоих *.ini >вывод сообщения о совпадении ;
3. Сравнивается третья строка обоих *.ini >вывод сообщения о совпадении ;
4. Сравнивается четвертая строка обоих *.ini>вывод сообщения о совпадении ;
5. Завершение работы скрипта.
Мне нужно так ,при успехе:
1. Сравнивается первая строка обоих *.ini ;
2. Сравнивается вторая строка обоих *.ini ;
3. Сравнивается третья строка обоих *.ini ;
4. Сравнивается четвертая строка обоих *.ini ;
5. Вывод сообщения,что все четыре строки в *.ini файлах совпали ;
6. Завершение работы скрипта.
Видимо несовсем понятно объяснил ,что мне нужно,уточню. »
Ничего-себе уточнил :
Как тема называется ? разве не так : "Как сравнить два массива не построчно,а целиком?"
И зачем тогда сравнивать построчно
Если тексты всей секции равны , то наверное и каждая строка равна , или я что-то не понимаю
Ошибаешься мой код выдает только 1 сообщение при полном успехе »
Он говорил про мой код, ибо когда он написал своё сообщение, твои два сообщения были пустые ;)
Мне нужно так ,при успехе »
$sCompare_File = "Compare.ini"
$sSample_File = "Sample.ini"
$aCompare_Sect = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sCompare_File, "HG")
$aSample_Sect = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sSample_File, "HG")
$iComp_Ubound = UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aCompare_Sect) - 1
$iSamp_Ubound = UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aSample_Sect) - 1
$iUbound = $iComp_Ubound
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iSamp_Ubound > $iComp_Ubound Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $iUbound = $iSamp_Ubound
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iComp_Ubound <> $iSamp_Ubound Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iComp_Ubound <= 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(48, $sCompare_File, "Данные файла [" & $sSample_File & "] не совпадают", 2); несовпадение массива
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sCompare = "совпадают"
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iUbound
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aCompare_Sect[$i][0] & $aCompare_Sect[$i][1] <> $aSample_Sect[$i][0] & $aSample_Sect[$i][1] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sCompare = "НЕ " & $sCompare
ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, $sCompare_File, "Данные файла [" & $sSample_File & "] " & $sCompare, 2)
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
Сижу, пробую, разбираюсь. Завтра к вечеру отпишусь.
Небольшой итог.Если где неправ,поправьте.
Коды 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.
pekich,
Вы сначала определитесь с задачей, я последним сообщением полностью сюит с толку.
Воспользовался как примером и сделал так: »
Вы конечно извините, но это бред, зачем превращать строки в массив, потом обратно в строки и проверять их?
Не проще ли так сделать:
$compare = "Compare.ini"
$sample = "Sample.ini"
$sCompare_SectText = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($compare)
$sSample_SectText = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sample)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sCompare_SectText <> $sSample_SectText Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, "Info", "Данные *.ini файлов НЕ-совпадают", 1)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(48, "Info", "Данные *.ini файлов совпадают", 1)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
№ 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)
Creat0R
Вы конечно извините, но это бред, зачем превращать строки в массив, потом обратно в строки и проверять их?
Ученье - это преодоление бреда чужого и своего. Общаясь с опытными людьми размер своего бреда уменьшается.
Хоть хелп и на русском ,но даже и с родгого языка приходится переводить.FileRead - ну не обратил внимание.
А,например, UBound - Вернуть размер размерности массива.Когда прочитал, то подумал-бред!
В последствии истолковал так : эта функция преобразует массив в некое единое значение.При том не уверен,что перевел
для себя правильно.
И с задачей я определился с первого поста:необходимо сравнить содержание двух *.ini файлов. А так как проглядел FileRead ,
то пришел к выводу , что нужно сравнивать массивы. Отсюда и заголовок темы. Зато поучился работать с массивами и это гуд.
gregaz
Следовало бы ввести проверку на существование секций с указанными именами , так :
Следовало бы проверять ,прежде чем выкладывать.Пробуйте в прикрепленных файлах.
SciTE сообщает:
If $aSample_SectText[0] = $aCompare_SectText[0] Then
If $aSample_SectText^ ERROR
Большое Всем спасибо за помощь.Живите и процветайте.
Вопрос решен.
Хоть хелп и на русском »
парадокс, хелп не на русском, а тот, что на русском не хелп :)
типа юмор :biggrin:
а теперь серьезно, русская справка настолько устарела, что пользоваться ею, подчас, вредно для кодинга. лучше взять актуальную английскую, и если с языком совсем туго, то использовать разного рода переводчики. не айс, но хоть что-то
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.