Что нового

Поиск не заполненны строк в файлах, с выводом подробного отчета

Tyr

Новичок
Сообщения
43
Репутация
4
Версия AutoIt:3.3.8.1
Описание:
Необходимо производить поиск строк в которых заполнен вид данных, но, отсутствуют сами данные (т.е. заполненная строка выглядит так: "ДатаДок: 11.01.12", а не заполненная: "ИННПП:"), и в случае обнаружения такой строки создавать файл с таким же именем как и проверяемый файл, но с разрешением .log.
Файл *log (в идеале) должен содержать:
№ строки начала блока в котором найдены пропущенные данные(блоки в текстовых файлах разделены "#"), Наименование пропущеного блока, ДатаОпер, НомДок, Дебет, Кредит
Данные пропуск которых необходимо проверять: 'НаимБП:', 'БИКБП:', 'НаимПП:', 'ИННПП:', 'НомСчПП:', 'НазнПл:'

Примечания:
madmasles, изменил и оптимизировал мой первоначальный код самой проверки на наличие пустых строк и сделал вывод в _ArrayDisplay :
Код:
#include <Encoding.au3>
#include <Array.au3>

Local $s_File = @ScriptDir & '\BV201_ZNO3434343.txt'

Local $a_Search[15] = [14, 'ДатаОпер:', 'ВидДок:', 'НомДок:', 'ДатаДок:', 'НомКорСч:', 'НаимБП:', 'БИКБП:', 'НаимПП:', 'ИННПП:', 'КПППП:', 'НомСчПП:', _
        'Дебет:', 'Кредит:', 'НазнПл:'], $v_Tmp, $a_Str, $a_Ret[1], $a_Tmp[$a_Search[0] + 1], $i_Len

Local $i_Timer = TimerInit()
$i_Len = StringLen($a_Search[1])
$v_Tmp = StringStripCR(_Encoding_OEM2ANSI(FileRead($s_File)))
For $i = 1 To $a_Search[0]
    If StringInStr($v_Tmp, $a_Search[$i] & @LF, 1) Then
;~  If StringRegExp($v_Tmp, '(?m)^' & $a_Search[$i] & '$') Then
        $a_Tmp[0] += 1
        $a_Tmp[$a_Tmp[0]] = $i
    EndIf
Next
If Not $a_Tmp[0] Then Exit MsgBox(64, '', 'All OK!')
$a_Str = StringSplit($v_Tmp, @LF)
$v_Tmp = 0
ReDim $a_Ret[$a_Str[0] + 1][$a_Tmp[0]]
For $i = 1 To $a_Str[0]
    For $j = 0 To $a_Tmp[0] - 1
        If $a_Str[$i] == $a_Search[$a_Tmp[$j + 1]] Then
            $a_Ret[0][$j] += 1
;~          $a_Ret[$a_Ret[0][$j]][$j] = $i
;~          $a_Ret[$a_Ret[0][$j]][$j] = $i & ' (' & $a_Str[$i - $a_Tmp[$j + 1] + 1] & ')'
            $a_Ret[$a_Ret[0][$j]][$j] = $i & ' (' & StringTrimLeft($a_Str[$i - $a_Tmp[$j + 1] + 1], $i_Len) & ')'
;~          ConsoleWrite($a_Str[$i - $a_Tmp[$j + 1] + 1] & @LF)
        EndIf
    Next
Next
For $i = 0 To $a_Tmp[0] - 1
    If $v_Tmp < $a_Ret[0][$i] Then $v_Tmp = $a_Ret[0][$i]
    $a_Ret[0][$i] = $a_Search[$a_Tmp[$i + 1]] & ' (' & $a_Ret[0][$i] & ')'
Next
ReDim $a_Ret[$v_Tmp + 1][$a_Tmp[0]]
ConsoleWrite(TimerDiff($i_Timer) & @LF)
_ArrayDisplay($a_Ret)


Так же вот мой изначальный код, который выбирал файлы по маске и последовательно выполнял их обработку:
Код:
#include <Array.au3>
#Include <File.au3> ;подключаем необходимые библиотеки

$dirIz = "C:\Users\Администратор\Desktop\bnb\test" ;задаем рабочую папку как переменну.
; проверяемые поля:
$dataOper = '„ в ЋЇҐа:'
$dataOperlen = StringLen($dataOper)
$vidDoc = '‚Ё¤„®Є:'
$vidDoclen = StringLen($vidDoc)
$nomDoc = 'Ќ®¬„®Є:'
$nomDoclen = StringLen($nomDoc)
$dataDoc = '„ в „®Є:'
$dataDoclen = StringLen($dataDoc)
$nomKS = 'Ќ®¬Љ®а‘з:'
$nomKSlen = StringLen($nomKS)
$naimBP = 'Ќ Ё¬ЃЏ:'
$naimBPlen = StringLen($naimBP)
$bicBP = 'Ѓ€ЉЃЏ:'
$bicBPlen = StringLen($bicBP)
$naimPP = 'Ќ Ё¬ЏЏ:'
$naimPPlen = StringLen($naimPP)
$iNNPP = '€ЌЌЏЏ:'
$iNNPPlen = StringLen($iNNPP)
$nomScPP = 'Ќ®¬‘зЏЏ:'
$nomScPPlen = StringLen($nomScPP)
$deb = '„ҐЎҐв:'
$debLen = StringLen($deb)
$kred = 'ЉаҐ¤Ёв:'
$kredLen = StringLen($kred)
$NaznP = 'Ќ §­Џ«:'
$NaznPLen = StringLen($NaznP)

; цикл проверки наличия файлов и получения их имен для цикла проверки самих файлов.
If FileExists($dirIz & '\BV*ZNO1*') Then ;проверяем наличие файла отвечающего маске
$aA = _FileListToArray($dirIz, 'BV*ZNO1*', 1);записываем имена файлов в массив
for $ii = 1 to $aA[0];запускаем цикл по длине массива
  ;  MsgBox(4096,"", $aA[$ii])
 _ProvercaStroc($aA[$ii]) ;Запускае основую процедуру которая внизу кода передавая параметры . элемент массива(имя файла) считывается в переменную
next  
Else
    MsgBox(4096,"","Нет файлов для обработки.")
EndIf
 
 ; Процедура поиска пустых значений напротив поля.
Func _ProvercaStroc($fileName)
$stroca = ''
$logRez = ''
$i = 0
$j = 0
Dim $aStrocMas[1] ; определил массв
$hFile = FileOpen($dirIz & "\"  & $fileName, 0);открываемый файл
While 1 ; бесконечный цикл
    $i += 1
    $stroca = FileReadLine($hFile, $i) ;считываю построчно строки файла в переменную STROCA
    If @error = -1 Then ExitLoop ;выхожу из цикла если строк больше нет
	   $len = StringLen($stroca) ;замеряю длину строки
   ;проверка входа подстроки с нужным текстом в эту строку и выписывает строку если длина строки равна пустой искомой строкое
If (StringInStr($stroca, $dataOper) and $len = $dataOperlen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $vidDoc) and $len = $vidDoclen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $nomDoc) and $len = $nomDoclen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $dataDoc) and $len = $dataDoclen) _ ;этот параметр по экспериментам не отсутствует  or (StringInStr($stroca, $nomKS) and $len = $nomKSlen) _	;Часто отсутствует - но налоговая на это не ругается 
    or (StringInStr($stroca, $naimBP) and $len = $naimBPlen) _ ;Иногда отсутствует
    or (StringInStr($stroca, $bicBP) and $len = $bicBPlen) _ ;Иногда нет
    or (StringInStr($stroca, $naimPP) and $len = $naimPPlen) _ ;Часто отсутствует
    or (StringInStr($stroca, $iNNPP) and $len = $iNNPPlen) _ ;Иногда отсутствует
    or (StringInStr($stroca, $nomScPP) and $len = $nomScPPlen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $deb) and $len = $debLen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $kred) and $len = $kredLen) _ ;этот параметр по экспериментам не отсутствует
    or (StringInStr($stroca, $NaznP) and $len = $NaznPLen) _ ;Иногда отсутствует
Then 
        $j += 1
        ReDim $aStrocMas[$j + 1]
        $aStrocMas[$j] = $i
		$logRez = $logRez & ' ' & ' ' & $i & ','
    EndIf
WEnd
FileClose($hFile)
If Not $j Then
    MsgBox(0, $fileName, 'Отсутствующих данных не найдено.')
Else
   MsgBox(0, $fileName, 'Данные пропущены в ' & $j & ' строках ' & @CR & @CR & $logRez )
EndIf
FileClose($dirIz & "\"  & $fileName)
EndFunc
Выкладываю несколько файлов для обработки
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Не работает внешний цикл при наличие внутреннего

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.






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

Tyr,
Используйте из Encoding UDF - Библиотека для работы с кодировками строк функции _Encoding_OEM2ANSI() или _Encoding_866To1251(), чтобы было удобно читать.
Код:
#include <Encoding.au3>

ConsoleWrite(_Encoding_866To1251('Ќ®¬‘зЏЏ:') & @LF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Не работает внешний цикл при наличие внутреннего

Tyr сказал(а):
Спасибо. Тему можно закрыть.

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Не работает внешний цикл при наличие внутреннего

Tyr [?]
Может кто подскажет как сделать так, что бы...
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.




Так должно быстрее работать.
Код:
#include <Encoding.au3>
#include <Array.au3>

Local $s_File = @ScriptDir & '\BV201_ZNO3434343.txt'

Local $a_Search[15] = [14, 'ДатаОпер:', 'ВидДок:', 'НомДок:', 'ДатаДок:', 'НомКорСч:', 'НаимБП:', 'БИКБП:', 'НаимПП:', 'ИННПП:', 'КПППП:', 'НомСчПП:', _
		'Дебет:', 'Кредит:', 'НазнПл:'], $v_Tmp, $a_Str, $a_Ret[1], $a_Tmp[$a_Search[0] + 1]

Local $i_Timer = TimerInit()

$v_Tmp = StringStripCR(_Encoding_OEM2ANSI(FileRead($s_File)))
For $i = 1 To $a_Search[0]
	If StringRegExp($v_Tmp, '(?m)^' & $a_Search[$i] & '$') Then
		$a_Tmp[0] += 1
		$a_Tmp[$a_Tmp[0]] = $i
	EndIf
Next
If Not $a_Tmp[0] Then Exit MsgBox(64, '', 'All OK!')
$a_Str = StringSplit($v_Tmp, @LF)
$v_Tmp = 0
ReDim $a_Ret[$a_Str[0] + 1][$a_Tmp[0]]
For $i = 1 To $a_Str[0]
	For $j = 0 To $a_Tmp[0] - 1
		If $a_Str[$i] == $a_Search[$a_Tmp[$j + 1]] Then
			$a_Ret[0][$j] += 1
			$a_Ret[$a_Ret[0][$j]][$j] = $i
		EndIf
	Next
Next
For $i = 0 To $a_Tmp[0] - 1
	If $v_Tmp < $a_Ret[0][$i] Then $v_Tmp = $a_Ret[0][$i]
	$a_Ret[0][$i] = $a_Search[$a_Tmp[$i + 1]] & ' (' & $a_Ret[0][$i] & ')'
Next
ReDim $a_Ret[$v_Tmp + 1][$a_Tmp[0]]
ConsoleWrite(TimerDiff($i_Timer) & @LF)
_ArrayDisplay($a_Ret)
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Re: Не работает внешний цикл при наличие внутреннего

madmasles, так реально раз в 10 быстрее - те файлы которые обрабатывал за 2 минуты, за 10 секунд считает. Сейчас разберусь как к каждой записи подтянуть значение строки "ДатаОпер:" относящаяся к ошибке (пока мысли такие: от поля с ошибкой искать вверх "###" и от него "ДатаОпер:" ... и тогда вообще ШИК будет
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Не работает внешний цикл при наличие внутреннего

Tyr [?]
Сейчас разберусь как к каждой записи подтянуть значение строки "ДатаОпер:" относящаяся к ошибке
Код:
#include <Encoding.au3>
#include <Array.au3>

Local $s_File = @ScriptDir & '\BV201_ZNO3434343.txt'

Local $a_Search[15] = [14, 'ДатаОпер:', 'ВидДок:', 'НомДок:', 'ДатаДок:', 'НомКорСч:', 'НаимБП:', 'БИКБП:', 'НаимПП:', 'ИННПП:', 'КПППП:', 'НомСчПП:', _
		'Дебет:', 'Кредит:', 'НазнПл:'], $v_Tmp, $a_Str, $a_Ret[1], $a_Tmp[$a_Search[0] + 1], $i_Len

Local $i_Timer = TimerInit()
$i_Len = StringLen($a_Search[1])
$v_Tmp = StringStripCR(_Encoding_OEM2ANSI(FileRead($s_File)))
For $i = 1 To $a_Search[0]
	If StringInStr($v_Tmp, $a_Search[$i] & @LF, 1) Then
;~ 	If StringRegExp($v_Tmp, '(?m)^' & $a_Search[$i] & '$') Then
		$a_Tmp[0] += 1
		$a_Tmp[$a_Tmp[0]] = $i
	EndIf
Next
If Not $a_Tmp[0] Then Exit MsgBox(64, '', 'All OK!')
$a_Str = StringSplit($v_Tmp, @LF)
$v_Tmp = 0
ReDim $a_Ret[$a_Str[0] + 1][$a_Tmp[0]]
For $i = 1 To $a_Str[0]
	For $j = 0 To $a_Tmp[0] - 1
		If $a_Str[$i] == $a_Search[$a_Tmp[$j + 1]] Then
			$a_Ret[0][$j] += 1
;~ 			$a_Ret[$a_Ret[0][$j]][$j] = $i
;~ 			$a_Ret[$a_Ret[0][$j]][$j] = $i & ' (' & $a_Str[$i - $a_Tmp[$j + 1] + 1] & ')'
			$a_Ret[$a_Ret[0][$j]][$j] = $i & ' (' & StringTrimLeft($a_Str[$i - $a_Tmp[$j + 1] + 1], $i_Len) & ')'
;~ 			ConsoleWrite($a_Str[$i - $a_Tmp[$j + 1] + 1] & @LF)
		EndIf
	Next
Next
For $i = 0 To $a_Tmp[0] - 1
	If $v_Tmp < $a_Ret[0][$i] Then $v_Tmp = $a_Ret[0][$i]
	$a_Ret[0][$i] = $a_Search[$a_Tmp[$i + 1]] & ' (' & $a_Ret[0][$i] & ')'
Next
ReDim $a_Ret[$v_Tmp + 1][$a_Tmp[0]]
ConsoleWrite(TimerDiff($i_Timer) & @LF)
_ArrayDisplay($a_Ret)
Какой максимальный размер файлов?
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Re: Не работает внешний цикл при наличие внутреннего

madmasles
Дайте реальный, лучше самый большой, файл.
Вот несколько файлов(самых больших - 21170 строк). Обычно обрабатывается сразу штуки 4-7... можно конечно выводить это всё в Listbox используя библиотеки массивов, но удобнее наверное было бы в файл (хотя это как я понимаю усложнит процедуру?)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Tyr
Так подойдет:
Код:
#include <Encoding.au3>
#include <Array.au3>
#Include <File.au3> ;подключаем необходимые библиотеки

$dirIz = "d:\56756" ;задаем рабочую папку как переменну.

; цикл проверки наличия файлов и получения их имен для цикла проверки самих файлов.
If FileExists($dirIz & '\BV*ZNO1*') Then ;проверяем наличие файла отвечающего маске
$aA = _FileListToArray($dirIz, 'BV*ZNO1*', 1);записываем имена файлов в массив
for $ii = 1 to $aA[0];запускаем цикл по длине массива
  ;  MsgBox(4096,"", $aA[$ii])
 _ProvercaStroc($aA[$ii]) ;Запускае основую процедуру которая внизу кода передавая параметры . элемент массива(имя файла) считывается в переменную
next
Else
    MsgBox(4096,"","Нет файлов для обработки.")
EndIf

Func _ProvercaStroc($file_name)
    TrayTip("Обработка файла:", $file_name, 5)
    Local $lines[1], $results[1], $what[6] = ['НаимБП:~', 'БИКБП:~', 'НаимПП:~', 'ИННПП:~', 'НомСчПП:~', 'НазнПл:~']

	; 1. Т.к. перевод строки в обрабатываемых файлах состоит из двух символов (@CR & @LF)
	;    иначе - @CRLF (сначала идет байт @CR потом @LF)
	; 2. в обрабатываемых файлах отсутсвует '~'
	;    сначала заменяем последовательность символов ':' & @CR на ':~' & @CR
	;    в результате получаем пустые строки с окончанием '~'
	; 3. StringStripCR - убираем байт @CR
	; 4. StringSplit - создаем массив из предыдущего результата взяв разделителем оставшийся @LF
    $lines = StringSplit(StringStripCR(StringReplace(_Encoding_OEM2ANSI(FileRead($dirIz & "\"  & $file_name)), ':' & @CR, ':~' & @CR)), @LF)
    Local $log_name = $dirIz & "\" & StringTrimRight($file_name,4)  & ".log"
    FileDelete($log_name)

	; $results = индексы всех вхождений ':~' в массиве строк обрабатываемого файла
    $results = _ArrayFindAll($lines, ':~', 0, 0, 0, 1)

	; Пересматриваем все строки без значений
    For $i = 0 To UBound($results) - 1

		; $what = массив пустых строк имеющих повод попасть в лог
		; сравниваем следующую "пустую" строку с этим массивом
        Local $line = _ArraySearch($what, $lines[$results[$i]])
        If $line <> -1 Then

			; Ok - поднимаемся наверх по строкам до появления начала блока
            $line = $results[$i]
            While 1
                $line = $line - 1
                If $lines[$line] = '###' Then ExitLoop
			WEnd

			; Пишем начало блока в лог
            FileWrite($log_name, $line & @TAB)

			; Поле с отсутсвующим значением
            FileWrite($log_name, StringTrimRight($lines[$results[$i]], 2) & @TAB)

			; Записываем значащие поля начиная поиск с начала блока
            FileWrite($log_name, $lines[_ArraySearch($lines, 'ДатаОпер', $line, 0, 1, 1)] & @TAB)
            FileWrite($log_name, $lines[_ArraySearch($lines, 'НомДок', $line, 0, 1, 1)] & @TAB)
            FileWrite($log_name, $lines[_ArraySearch($lines, 'Дебет', $line, 0, 1, 1)] & @TAB)
            FileWrite($log_name, $lines[_ArraySearch($lines, 'Кредит', $line, 0, 1, 1)] & @CRLF)
        EndIf
    Next
EndFunc   ;==>_ProvercaStroc
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Z_Lenar Всё Ок :ok:. То, что надо Результат 1 в 1, как представлял. И даже вывод в трей и то что файлы лога затираются, а не просто до записываются.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Мой вариант, ИМХО, должен быть самый быстрый.
Код:
#include <Encoding.au3>
#include <File.au3>

Opt('MustDeclareVars', 1)

Global $aCheck_String, $sDir_Search, $sFile_Mask, $hFile_Log, $aFiles, $iTimer = TimerInit()

If Not _Start($aCheck_String, $sDir_Search, $sFile_Mask, $hFile_Log) Then Exit MsgBox(16, 'Error', 'Ошибка открытия лог-файла!')
$aFiles = _FileListToArray($sDir_Search, $sFile_Mask, 1)
If @error Then Exit MsgBox(16, 'Error', 'Ошибка поиска  файлов для проверки!')
FileWrite($hFile_Log, 'Папка для проверки: ' & $sDir_Search & @CRLF & 'Маска поиска файлов: ' & $sFile_Mask & @CRLF & _
		'Найдено файлов: ' & $aFiles[0] & StringFormat('\r\nПроверка начата: %02d.%02d.%04d %02d:%02d:%02d\r\n\r\n', @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC))
_Check_vrb_File($sDir_Search, $aFiles, $aCheck_String, $hFile_Log, $iTimer)
MsgBox(64, 'Result', 'Обработано файлов: ' & $aFiles[0])

Func _Check_vrb_File($s_Dir_Search, $a_Files, $a_Check_String, $h_File_Log, $i_Timer)
	Local $s_Log, $s_Txt, $a_Txt, $i_NumStr, $a_Tmp

	For $q = 1 To $a_Files[0]
		$s_Log = $q & '. файл: ' & $a_Files[$q] & '; размер: ' & FileGetSize($s_Dir_Search & '\' & $a_Files[$q]) & ' b' & @CRLF
		$s_Txt = _Encoding_OEM2ANSI(FileRead($s_Dir_Search & '\' & $a_Files[$q]))
		For $i = 1 To $a_Check_String[0][0]
			$s_Log &= StringFormat('%-' & $a_Check_String[0][1] & 's', $a_Check_String[$i][0])
			$a_Txt = StringSplit($s_Txt, $a_Check_String[$i][0] & @CRLF, 1)
			If @error Then
				$s_Log &= 'OK' & @CRLF
				ContinueLoop
			EndIf
			$i_NumStr = $a_Check_String[$i][1]
			For $j = 1 To $a_Txt[0] - 1
				$a_Tmp = StringSplit($a_Txt[$j], @CRLF, 1)
				$i_NumStr += $a_Tmp[0]
				$a_Tmp = 0
				$s_Log &= $i_NumStr & '; '
			Next
			$s_Log = StringTrimRight($s_Log, 2) & '.' & @CRLF
		Next
		$s_Log &= '----------------------------' & @CRLF
		FileWrite($h_File_Log, $s_Log)
		$s_Log = ''
	Next
	FileWrite($h_File_Log, StringFormat('Продолжительность проверки: %.3f сек.', TimerDiff($i_Timer) / 1000))
	FileClose($h_File_Log)
	Return $a_Files[0]
EndFunc   ;==>_Check_vrb_File

Func _Start(ByRef $a_Check_String, ByRef $s_Dir_Search, ByRef $s_File_Mask, ByRef $h_File_Log)
	Local $s_Ini = @ScriptDir & '\Check_vrb.ini', $i_Tmp, $s_File_Log

	$a_Check_String = IniReadSection($s_Ini, 'Check_String')
	If @error Then
		Dim $a_Check_String[15][2] = [[14, 10],['ДатаОпер:', -1],['ВидДок:', -2],['НомДок:', -3],['ДатаДок:', -4],['НомКорСч:', -5],['НаимБП:', -6], _
				['БИКБП:', -7],['НаимПП:', -8],['ИННПП:', -9],['КПППП:', -10],['НомСчПП:', -11], _
				['Дебет:', -12],['Кредит:', -13],['НазнПл:', -14]]
	Else
		For $i = 1 To $a_Check_String[0][0]
			$a_Check_String[$i][1] = -Number($a_Check_String[$i][1])
			$i_Tmp = StringLen($a_Check_String[$i][0])
			If $a_Check_String[0][1] < $i_Tmp Then $a_Check_String[0][1] = $i_Tmp
		Next
		$a_Check_String[0][1] += 1
	EndIf
	$s_Dir_Search = IniRead($s_Ini, 'Info', 'dir_search', @ScriptDir)
	$s_File_Mask = IniRead($s_Ini, 'Info', 'file_mask', '*.vrb')
	$s_File_Log = IniRead($s_Ini, 'Info', 'file_log', @ScriptDir & '\Log_Check_vrb.txt')
	$h_File_Log = FileOpen($s_File_Log, 10)
	Return ($h_File_Log <> -1)
EndFunc   ;==>_Start
В прикрепленном архиве ини-файл Check_vrb.ini (должен лежать в одной папке со скриптом), в нем есть некоторые пояснения.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
madmasles
Забавно... Я не понял откуда "такой" выйгрыш в скорости? :blink:
Если бы писал на С++ добавил бы простенькую проверку по crc в цикле перебора строк. Но здесь посимвольная обработка не катит :(
 
Верх