Что нового

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

Автор
M

man_without_face

Новичок
Сообщения
17
Репутация
0
Alofa сказал(а):
man_without_face что скажете по Варианту 1?
OffTopic:
Дайте ссылку на программу, которой пользуетесь для распознавания pdf417

Страница загрузки bytescout.com/products/enduser/misc/barcodereader.html


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


Вариант 1:

То есть мы знаем что каждая анкета железно начинается на "<", далее идут 25 блоков разделенных ";" . 25й блок либо пустой, либо имеет формат "01.04.16" и оканчивается либо на ">", либо пробелом?[/spoiler]


Начало, да. А 25 блок может быть и 01.04.16 и 01.04.2016 и даже 010416 и 01042016.
Объясню почему. В 24 блоке содержится регистрационный номер, а в 25 - дата регистрации. Исполнители эти поля не заполняют, т.к. эти реквизиты присваиваются позже.

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

Поэтому и включил эти блоки в запись.

На этапе ввода в форму сделал проверку - если эти блоки пустые, появляется запрос на ввод данных. Хотя думаю перенести эту проверку на этап обработки файла. Там ввод этих данных будет быстрее, т.к. перенос в форму занимает больше времени - пришлось добавить задержки из-за того, что программа не успевала переключаться между полями. В среднем ввод одной анкеты у скрипта занимает секунд 12, но может получится снизить это время.
 
Автор
M

man_without_face

Новичок
Сообщения
17
Репутация
0
Что у меня получилось на данный момент

Код:
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
$filepath = ""
$fileselected = 0

OpenFile()
Func OpenFile()
Local Const $sMessage = "Выберите файл."
Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "Текст (*.txt)", $FD_FILEMUSTEXIST)
If @error Then
MsgBox($MB_SYSTEMMODAL,	"", "Файл не выбран.")
$fileselected=0
FileChangeDir(@ScriptDir)
Else
FileChangeDir(@ScriptDir)
$filepath = $sFileOpenDialog
$sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF)
$fileselected=1
EndIf
EndFunc

if ($fileselected=1) Then
$skip=0
$skiperror=0
$rowscounter=0
$rowinputcounter=0
$sTextFile = StringRegExpReplace(FileRead($filepath), @CRLF, '') ;убираем из текста символы переноса строк
;~ $a1=StringRegExp($sTextFile, "\<(.*?)\>", 3) ;вариант не учитывающий случайные открывающие теги
$a1=StringRegExp($sTextFile, "(?=[^\<]*\>)(.*?)\>", 3) ;вариант учитывающий случайные открывающие теги
Dim $aRes[UBound($a1)][25] ;задаем массив на количество обнаруженных записей по тегам
For $i = 0 to UBound($a1)-1
   $ar = StringSplit($a1[$i], ";", 2);делим записи на блоки по разделителю
   if UBound($ar)<>25 Then ;проверяем количество полученных блоков, в правильном варианте = 25
	  if UBound($ar)>20 Then ;сообщение, только если в строке больше 20 блоков - все что меньше, скорее всего из-за случайного тега
		 MsgBox(48,'Внимание!', 'Следующий учетный лист распознан некорректно' &@CRLF&'('&UBound($ar)&' записей вместо 25) и будет пропущен:'& @CRLF& @CRLF &$a1[$i]& @CRLF& @CRLF &'Повторите обработку учетного листа')
		 $skiperror=$skiperror+1 ;счетчик некорректных записей
	  EndIf
	  $skip=$skip+1 ;счетчик всех пропущенных строк
	  ContinueLoop ;пропускаем некорректную строку
   EndIf
   For $j=0 to 24 ;цикл внесения блоков в массив
 	  if $j=23 and StringStripWS($ar[$j],3)='' Then ;проверяем поле 24, если оно пустое, запрашиваем данные и помещаем их в массив, убирая лишние пробелы в начале и в конце блока
 		$aRes[$i-$skip][$j]=InputBox("Уточнение данных","Запись: "&$aRes[$i-$skip][0] &" "&$aRes[$i-$skip][1]&" "&$aRes[$i-$skip][2]&@CRLF&@CRLF&"Номер","")
 		ElseIf $j=24 and StringStripWS($ar[$j],3)='' Then ;проверяем поле 25, если оно пустое, запрашиваем данные и помещаем их в массив, убирая лишние пробелы в начале и в конце блока
 		$aRes[$i-$skip][$j]=InputBox("Уточнение данных","Запись: "&$aRes[$i-$skip][0] &" "&$aRes[$i-$skip][1]&" "&$aRes[$i-$skip][2]&@CRLF&@CRLF&"Дата поступления материалов","")
 		 Else
	  $aRes[$i-$skip][$j]=StringStripWS($ar[$j],3) ;помещаем блок в массив, убирая лишние пробелы в начале и в конце блока
 	  EndIf
   Next
   $rowscounter=$rowscounter+1 ;счетчик обработанных строк
Next
MsgBox(64,'Выполнено!', 'Успешно распознано: '&$rowscounter&''& @CRLF& 'Пропущено некорректных: '&$skiperror& ''&''& @CRLF& 'Обнаружено ошибок: '&$skip-$skiperror& '') ;сообщаем результаты обработки

ReDim $aRes[$rowscounter][25] ;сжимаем массив, убирая пустые строки
_ArrayDisplay($aRes ,"Предварительный просмотр", Default, 32) ;предварительный просмотр результатов

if MsgBox($MB_YESNO,	"Все правильно?", "Начать внесение данных?")=7 Then ;запрос на разрешение внесения записей в базу данных
   MsgBox(48,'Отменено', 'Данные не внесены') ;
   Exit
   else
run ("C:\Program Files\программа\программа.exe")


$rowinputcounter=$rowinputcounter+1
;MsgBox($MB_SYSTEMMODAL,	"", "Внесено записей: " & $rowinputcounter)
Next
MsgBox($MB_SYSTEMMODAL,	"", "Обработка файла " & $filepath & " завершена." & @CRLF & "Всего внесено записей: " & $rowinputcounter)
EndIf
EndIf
Exit



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

Это без части кода, переносящей данные в формы базы данных. Там эмуляция нажатий клавиш с ожиданием открытия окон и несколько проверок и замен.
 
Верх