Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как сравнить два массива не построчно,а целиком? (http://forum.oszone.net/showthread.php?t=190017)

pekich 01-11-2010 22:20 1532622

Как сравнить два массива не построчно,а целиком?
 
Пожалуйста подскажите в каком направлении двигаться, или помогите написать скрипт.
Всем ответившим спасибо за советы и помощь.
Дано:
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


Creat0R 01-11-2010 23:45 1532675

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

Цитата:

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




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

pekich 02-11-2010 00:30 1532697

Исправлю

Creat0R 02-11-2010 01:39 1532725

Цитата:

Цитата 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


gregaz 02-11-2010 06:42 1532763

Вот вариант без построчной обработки массива :
Код:

$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 07:16 1532775

Возможен вариант с использованием ф-ии : _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)

но он работает на порядок медленнее

pekich 02-11-2010 10:24 1532886

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

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

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

gregaz 02-11-2010 12:02 1532969

Цитата:

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

Ничего-себе уточнил :

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

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

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

Creat0R 02-11-2010 13:23 1533042

Цитата:

Цитата 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


pekich 02-11-2010 20:17 1533347

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

pekich 03-11-2010 17:58 1534016

Небольшой итог.Если где неправ,поправьте.
Коды 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.

Creat0R 03-11-2010 18:37 1534048

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


gregaz 03-11-2010 21:54 1534200

Цитата:

Цитата 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)


pekich 04-11-2010 13:55 1534606

Вложений: 1
Creat0R
Цитата:

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

gregaz
Цитата:

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

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

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

kaster 04-11-2010 23:36 1535015

Цитата:

Цитата pekich
Хоть хелп и на русском »

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


Время: 02:10.

Время: 02:10.
© OSzone.net 2001-