Что нового

Определение вида документа по тексту и его переименование по тексту.

L1nked

Новичок
Сообщения
7
Репутация
0
Добрый день!

Версия AutoIt: 3.3.0.0

Описание: Допустим есть 3 файла txt в папке С:\test: A, B, C
A - фактура, B - накладная, C - предложение
в файле A текст такой: СЧЕТ-ФАКТУРА N 53551090000553
в файле B текст такой: счет-фактура 53550090918667
ТОВАРНАЯ НАКЛАДНАЯ
в файле C текст такой: ПРЕДЛОЖЕНИЕ: Y222222/10

Все что подчеркнуто - это ключевые слова поиска, которые никогда не меняются.
Все что жирным - это символы, которые должны быть в названии файла, они всегда разные.

К названию файла в начале должно прикрепиться sf_ к счет-фактуре, tn_ к накладной, qu_ к предложению.

В конце должно получиться: sf_1090000553 , tn_0090918667 , qu_Y222222/10

ИМХО, скрипт должен открыть первый файл, поиск в нем "НАКЛАДНАЯ", если есть то еще еще раз поиск по "5355" все что дальше копирует в буфер и обзывает файл прибавляя в начале sf_ и перекидывает в другую папку.
если нету такого слова, значит ищет "ФАКТУРА", если есть, то ищет "5355" и как в пункте 1.
если нету такого слова, тогда ищет ПРЕДЛОЖЕНИЕ, слово должно найтись, если нет то заново... как-то так

Если есть возможность было бы хорошо, чтобы скрипт сканировал папку в которой находятся txt на наличие новых файлов, так как они будут добавляться..

Надеюсь на вашу помощь.

Примечания: Только недавно открыл для себя AutoIt, но только сегодня понял что версия у меня v3.3.0.0, боюсь что если обновлю то все что я знал(а знал я немного) будет неприменимо к новой версии..
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
L1nked
Давайте уточним задачу.
1. Файлы A, B, C точно .txt, а не Word или Excel, т.е. расширение у них одно или нет.
2. Искомые слова находятся в каком диапазоне начальных строк.
3. Обязательно удалять именно 4 цифры (т.е. в дальнейшем не 5 или 3 ...)
4. Раскладывать их нужно по 3-м папкам (sf, tn, qu) или нет.
5. На мой взгляд можно еще организовать в папках п.4 подпапки по датам (месяц или квартал).
6. Лучше всего, чтобы Вы выложили хотя бы по 1-му образцу начальных файлов.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Попробуй вот это
Код:
#include <File.au3>
$sFolder_init = 'path1'; 
$sFodler_final = 'path2'; 

$aTXT_files = _FileListToArray($sFodler_init, '*.txt', 1)

$sCond1 = 'СЧЕТ-ФАКТУРА N 5355'
$sCond2 = 'ТОВАРНАЯ НАКЛАДНАЯ'
$sCond2_sub = 'счет-фактура 5355'
$sCond3 = 'ПРЕДЛОЖЕНИЕ: '

For $i = 1 to $aTXT_files[0]
	$sContent = FileRead($sFolder_init & '\' & $aTXT_files[$i])
	If StringInStr($content, $sCond1) Then
		$iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond1 & '(.{10}).*', '\1')
		FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\sf_' & $iCode & '.txt')
		MsgBox(48, 'Done', 'File' & @CRLF & _ 
			$sFolder_init & '\' & $aTXT_files[$i] & _
			' was succesfully processed and its new path is' & @CRLF & _
			$sFolder_final & '\sf_' & $iCode & '.txt' _
		)
	EndIf
	If StringInStr($content, $sCond2) Then
		$iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond2_sub & '(.{10}).*', '\1')
		FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\tn_' & $iCode & '.txt')
		MsgBox(48, 'Done', 'File' & @CRLF & _ 
			$sFolder_init & '\' & $aTXT_files[$i] & _
			' was succesfully processed and its new path is' & @CRLF & _
			$sFolder_final & '\tn_' & $iCode & '.txt' _
		)
	EndIf
	If StringInStr($content, $sCond3) Then
		$iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond3 & '(.{10}).*', '\1')
		$iCode = StringReplace($iCode, '/', '_')
		FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\qu_' & $iCode & '.txt')
		MsgBox(48, 'Done', 'File' & @CRLF & _ 
			$sFolder_init & '\' & $aTXT_files[$i] & _
			' was succesfully processed and its new path is' & @CRLF & _
			$sFolder_final & '\qu_' & $iCode & '.txt' _
		)
	EndIf
Next

К слову говоря, в винде обзывать файлы с использованием слешей как в одну так и в другую сторону нелья. поэтому название файла qu_Y222222/10 недопустимо. я заменил его на qu_Y222222_10


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

Немного подправил код, была небольшая ошибка при копировании
 
Автор
L

L1nked

Новичок
Сообщения
7
Репутация
0
ух ты, сейчас потещщу, но сначала отвечу на вопросы madmasles:

1. Файлы A, B, C точно .txt, а не Word или Excel, т.к. они получаются путем распознавания Файнридером, я ставлю любой формат и в папку кидаются только тхт.
2. Везде по-разному. В с-ф все рядом, в накладной как я написал, а слово НАКЛАДНАЯ находится в центре страницы.
3. Да, первые 4 цифры (5355) не нужны(только для поиска), остальные цифры должны быть в названии, по ним другой скрипт прикрепляет файл в БД.
4. Раскладывать их нужно в одну общую папку, оттуда другой скрипт ищет первый по алфавиту файл, режет первые три символа спереди и 4 сзади(.txt), втыкает оставшееся в поле номера документа и прикладывает сам файл, но это уже совсем другая история)) главное создать первый этап - переименование по типу документа.
5. см. выше
6. выкладываю образцы

http://img685.imageshack.us/i/59359311.jpg/
http://img638.imageshack.us/i/98705202.jpg/
http://img11.imageshack.us/i/81813026.jpg/
 
Автор
L

L1nked

Новичок
Сообщения
7
Репутация
0
Скрипт работает, все отлично, огромное спасибо.

только мсжбоксы уберу)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
L1nked [?]
только мсжбоксы уберу)
это исключительно для проверки было, что-бы ничего не ушло куда не надо. дальше можешь сам пофантазировать :laugh:
 
Автор
L

L1nked

Новичок
Сообщения
7
Репутация
0
Добрый день!

После вырезания месседжбоксов получается вот что:
Код:
#include  <File.au3>
$sFolder_init = 'D:\TEST';
$sFolder_final = 'D:\TEST';

$aTXT_files = _FileListToArray($sFolder_init, '*.txt', 1)

$sCond1 = 'СЧЕТ-ФАКТУРА N 5355'
$sCond2 = 'ТОВАРНАЯ НАКЛАДНАЯ'
$sCond2_sub = 'счет-фактура 5355'
$sCond3 = 'ПРЕДЛОЖЕНИЕ: '

For $i = 1 to $aTXT_files[0]
    $sContent = FileRead($sFolder_init & '\' & $aTXT_files[$i])
    If StringInStr($sContent, $sCond1) Then
        $iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond1 & '(.{10}).*', '\1')
        FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\sf_' & $iCode & '.txt')
    EndIf
    If StringInStr($sContent, $sCond2) Then
        $iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond2_sub & '(.{10}).*', '\1')
        FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\tn_' & $iCode & '.txt')
    EndIf
    If StringInStr($sContent, $sCond3) Then
        $iCode = StringRegExpReplace($sContent, '(?s).*' & $sCond3 & '(.{10}).*', '\1')
        $iCode = StringReplace($iCode, '/', '_')
        FileCopy($sFolder_init & '\' & $aTXT_files[$i], $sFolder_final & '\qu_' & $iCode & '.txt')
    EndIf
Next


подскажите, пожалуйста, как будет выглядеть скрипт, если файл txt уже будет открыт в файнридере? т.е. в первом случае у нас уже имелись готовые txt файлы, а здесь их даже не будет. В файнридер вставляется PDF, открывается, распознается первая страница. Далее после распознавания в правой половине экрана будет изменяемая txt страница из которой можно выдернуть названия для файлов.
Скрин такой:
http://img713.imageshack.us/img713/4691/qwertyu.jpg

Ранее я на коленках написал скрипт по распознаванию и переименованию в FineReader 9 счет-фактуры, примитивно, но работал:
Код:
FileChangeDir("G:\A&D_alle\ARCHIV")        ; сюда кидаются пдф (счет-фактура)
$search = FileFindFirstFile("*.pdf")
If $search = -1 Then
    MsgBox(0, "Error", "No pdf files")
    Exit
EndIf
While 1
     $old_name = FileFindNextFile($search)
     If @error Then ExitLoop
Sleep(1000)     
WinActivate("ABBYY FineReader 9.0 Professional Edition")
WinWaitActive("ABBYY FineReader 9.0 Professional Edition")
Sleep(1000)
Send("^o"); открываем новый пакет 
Send("G:\A&D_alle\ARCHIV\"&$old_name)  ; выбираем первый по списку пдф
Sleep(1500)
Send("{ENTER}")      
Sleep(12500)          ; открывает пдф
WinClose ( "Adding pages to the document..." , "" )
WinWaitClose("Adding pages to the document..." , "" )
Sleep(1500)   
Send("!l")         ; rotate 90 градусов для правильного распознавания
Sleep(1500)   
Send("^r")       ; распознаем
WinWait ( "Reading...", "Close" )
WinActivate ( "Reading...", "Close" )
Sleep(1500)
Send("{ENTER}")
Sleep(1500)   
Send("^f")       ; поиск в текстовом окне распознанной страницы
Sleep(1500)
Send("5355")    ; ищем "5355"
Sleep(1500)
Send("{ENTER}")
Sleep(1500)
ControlClick ("Find", "Close", "Button9")     ; закрываем окно поиска
Send("{RIGHT 3}")                                ; нашли 5355, оно выделилось переходим клавиатурой до нужного нам номера, зажимаем шифт и копируем в буфер обмена.. 
Send("{SHIFTDOWN}")
Send("{RIGHT 8}")
Send("{SHIFTUP}")
Sleep(1500)
Send("^c")
Sleep(1500)
$number=ClipGet ( )
Sleep(500)
Send("+x")              ; закрываем текущее окно в файнридере
Sleep(500)
Send("{TAB}{ENTER}")
Sleep(2000)
FileMove ( "G:\A&D_alle\ARCHIV\"&$old_name, "G:\A&D_alle\SAP_Upload\sf_"&$number&".pdf", 1 )              ; переносим этот файл в другую папку обзывая номером из буфера обмена и приписывая вид документа - sf_
WEnd



Извиняюсь за примитив, но объяснил как мог, буду признателен если подскажете)
 
Верх