Что нового

Поиск резко отличающихся строк в файлах

Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
т.е. алгоритм должен быть:
Берется строка со 2-го файла
н-р:
6140001374
К ней прибавляется и вычитается 20 (получается диапазон 6140001354 - 6140001394)
смотрится:
есть ли с 1-го файла хоть 1 строка, котрая попадает в этот диапазон, если нет,
то
6140001374 - считается "новым" файлом и заносится в файл "res.txt"
Если нет
то обрабатывается аналогичным образом 2-я строка 2-го файла.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Попробуем еще и так.
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Код:
#include <File.au3>

$fileout = FileOpen("out.txt", 1)

$file1 = FileOpen("1.txt", 0)
$file2 = FileOpen("2.txt", 0)


$Count1 = _FileCountLines("1.txt") ; число строк в файле 1
$Count2 = _FileCountLines("2.txt") ; число строк в файле 1

$i = 1
While $i <= $Count2
    
	$f2 = FileReadLine($file2, $i)
	
	$j = 1
	While $j <= $Count1
		
		$f1 = FileReadLine($file1, $j)
			
			If $f1 > $f2-20 And $f1 < $f2+20 Then MsgBox (0, "000", $f2&" "&$f1, 6)
		
		$j = $j+1
	WEnd
	
	MsgBox(0, "999", $f2)
	
    $i = $i + 1
WEnd


Что то типа такого, НО при работе этого по строке
Код:
If $f1 > $f2-20 And $f1 < $f2+20 Then MsgBox (0, "000", $f2&" "&$f1, 6)

выводится случай, когда НЕ появляется новый диапазон, а вот чтоб выводился (ну или хотя б куда то вписывался) новоявленный диапазон - не могу сообразить.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Ура! Я сделал. Сейчас немного причешу и выложу в этом же сообщении.


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

Собственно, скрипт.
Код:
#include <WindowsConstants.au3>
$Form1 = GUICreate("Прогресс операции сравнения:", 530, 37, 192, 124, -1, BitOR($WS_EX_TOOLWINDOW,$WS_EX_WINDOWEDGE))
$Progress1 = GUICtrlCreateProgress(8, 8, 510, 17)
GUISetState(@SW_SHOW)

; Определяем количество строк в файле. 10 знаков на саму строчку с цифрой и 2 знака переноса строки - @CR, @LF.
; Таким образом нам не нужно перечислять строки с помощью _FileCountLines, экономим время. Не идеально точно, но очень быстро и для прогресс-бара сойдет.
; Идеально точно количество строк будет вычислено, если в файле нет пустых строк.
Global $Lines_in_New = Round(FileGetSize("new.txt")/12)

$OldFile = FileOpen("old.txt", 0)
$NewFile = FileOpen("new.txt", 0)
$DiffFile = FileOpen("diff.txt", 1)

Global $OldStr[2000], $i = 1

While 1
	Local $t = FileReadLine($OldFile)
	If @error then ExitLoop
	If $t then
		$OldStr[$i] = $t
		$i += 1
	EndIf
WEnd
$OldStr[0] = $i
FileClose($OldFile)

$t = 0
Global $match = 0, $Count = 0

While 1
	$t = FileReadLine($NewFile)
	If @error then Exitloop
	For $i = 1 to $OldStr[0]
		If $t > $OldStr[$i]-20 and $t < $OldStr[$i]+20 then
			$match = 1
			ExitLoop
		EndIf
	Next
	If $match = 0 then ; подходящих данных не найдено, элемент явно лишний
		FileWriteLine($DiffFile, $t)
	Else
		$match = 0
	EndIf
	$Count += 1
	GUICtrlSetData($Progress1, Round(($Count/$Lines_in_New)*100))
WEnd
FileClose($NewFile)
FileClose($DiffFile)

MsgBox(0, "Успех!", "Подсчет закончен.")
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Проверяю варианты.
Пока в процессе, но похоже, что оно все верно.
:laugh: :laugh: :laugh:


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

Проверил на живых файлах/база, работает ИДЕАЛЬНО!!!!!!!!!!!!
:IL_AutoIt_1:

Причем работает настолько быстро, что прогресс бар оказался вообще не нужен.
 
Верх