Что нового

Последовательная обработка данных из нескольких файлов с задержкой

uritalex

Новичок
Сообщения
197
Репутация
3
Версия AutoIt: 3.

Описание:
Добрый день! Попытки самостоятельного решения вопроса не принесли желаемого результата так что в очередной раз спрашиваю у знатоков : Есть необходимость обработать данные из текстового файла для заполнения формы. т.к. скрипт (цикл) без дополнительных костылей не умеет запоминать какая строчка из файла была уже обработана, пришел к мнению что аналогично требуемому действию будет такой алгоритм:
1. В папке с программой создаются ряд файлов с названиями: 1.тхт, 2.тхт и т.д.
2. Функция проверяет наличие значения в ini файле и при определенном условии (самостоятельно) берет файл 1.тхт и производит обработку
3. По завершении обработки производит запись в ini что был обработан файл 1.тхт или просто записует 1
4. при повторном вызове функции производит сверку с записью в ini и при наличии там записи 1 (или другой) берет следующий файл 2.тхт и обрабатывет его.
5. После его обработки вносит изменение в ini файл. и так по кругу.

Код:
_FileReadToArray("url.txt", $aURL, 0, ",")
If @error Then Exit

For $i = 0 To UBound($aURL) - 1
  
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][0] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][1] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][2] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][3] & @LF)
  Sleep(300)
Next

Этот код работает сейчас. Но хотелось бы это дело чуток автоматизировать.
Как это реализовать даже отдаленно не могу сообразить т.к. мешает моя прямолинейность мышления и оч. категорическое отторжение всяких переменных без коих тут не обойтись.
По этой причине и прошу помощи у Знатоков!!! За ранее благодарен
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Ну раз ни кто не хочет буду сам с собой говорить :'(
И так лед тронулся господа:
Начинаем нашу функцию (скрипт) с
Код:
#include <File.au3>
#include <Array.au3>

$FileList=_FileListToArray(@DesktopDir, "*.txt")
      If @error=4 Then
             MsgBox (0,"","Файлы/папки не найдены.")
             Exit
      EndIf
_ArrayDisplay($FileList,"$FileList") ; это нужно чтоб посмотреть что оно даст :) а даст оно нам список, или по правильному одномерный массив со списком файлов по маске *.тхт

Теперь как обратиться к тому либо другому файлу из добытого массива вот вопрос :scratch:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не иначе как: "Товарищ файл, позвольте к вам обратиться" :rofl:
Ну а если серьезно, то кажется что первый вопрос задал совершенного другой человек, тот первый умел обходить массив использую For To, а вот для второго - такой же массив уже стал проблемой
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Ну хоть кто то появился. И вообще не смешно :rofl: Первый и второй вопрос мои скрипт из первого вопроса подсказан. Я ж говорю что с абстрактными данными не дружу. Мой предел это вот полка вот пирожок, взять с этой полки тот пирожок :-[ и все
Код:
#include <File.au3>
#include <Array.au3>
Global $aURL
Local $FileList

$FileList=_FileListToArray(@DesktopDir, "*.txt")
If @error=4 Then
    MsgBox (0,"","Файлы/папки не найдены.")
    Exit
 EndIf

For $i = 0 To UBound($FileList) - 1

  $Fr = _FileReadToArray($FileList[$i], $aURL, 0, ",")

Next
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Вместо For $i = 0 To UBound($FileList) - 1 нужно For $i = 1 To $FileList[0]

А с абстрактными данными не так уж и сложно

Код:
$Кол-во пирожков=Функция подсчета('Пирожки')

For $Num=1 To $Кол-во пирожков
 Взять пирожок № $Num
 Съесть пирожок № $Num
Next

Func Функция подсчета($Что считаем)
 $Итого=Посчитать от начала до конца($Что считаем)
 Return $Итого
EndFunc
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Ааааа Видно с пирожками я погорячился :'( Подскажите что не так я делаю/понимаю

Код:
#include <File.au3>
#include <Array.au3>
Global $aURL
Global $FileList
Global $Fr

$FileList=_FileListToArray(@DesktopDir, "*.txt")
If @error=4 Then
    MsgBox (0,"","Файлы/папки не найдены.")
    Exit
 EndIf

For $i = 1 To $FileList[0]

  _FileReadToArray($FileList[$i], $aURL, 0, ",")

Next


Run("notepad.exe")
WinWait("[class:Notepad]")

For $i = 0 To UBound($aURL) - 1

  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][0] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][1] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][2] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][3] & @LF)
  Sleep(300)
Next


Содержимое искомого .тхт (пример)
Код:
www.yandex.ru,100,23,5
www.mail.ru,101,24,6
www.autoit-script.ru,102,25,7
www.autoitscript.com,103,26,8
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:beer:
Код:
#include <File.au3>
#include <Array.au3>

Local $files = _FileListToArray(@ScriptDir, '*.txt',  $FLTA_FILES, True)
If @error Then Exit MsgBox(0, 0, @ScriptLineNumber)

Run("notepad.exe")
WinWait("[class:Notepad]")

Local $file, $aData
For $i = 1 To UBound($files) - 1
	$file = $files[$i]
	If Not isUsed($file) Then
		setUsed($file)
		$aData = readFile($file)
		processData($aData)
	EndIf
Next

Func processData($aData)
	For $i = 0 To UBound($aData) - 1
	  ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][0] & ",")
	  ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][1] & ",")
	  ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][2] & ",")
	  ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][3] & @LF)
	Next
EndFunc

Func readFile($file)
	Local $aData
	_FileReadToArray($file, $aData, $FRTA_NOCOUNT, ",")
	Return $aData
EndFunc

Func setUsed($file)
	IniWrite('data.ini', 'used', $file, 1)
EndFunc

Func isUsed($file)
	Return IniRead('data.ini', 'used', $file, 0) = 1
EndFunc
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Ух ты :laugh: пока ваял да творил тута такое интересное появилося :smile: а я пока до этого додумался:
Код:
#include <File.au3>
#include <Array.au3>
Global $aURL
Global $FileList
Global $Fr

$FileList=_FileListToArray(@DesktopDir, "*.txt")
If @error=4 Then
    MsgBox (0,"","Файлы/папки не найдены.")
    Exit
 EndIf

For $i = 0 To UBound($FileList) - 1

  _FileReadToArray($FileList[1], $aURL, 0, ",")

Next


Run("notepad.exe")
WinWait("[class:Notepad]")

For $i = 0 To UBound($aURL) - 1

  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][0] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][1] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][2] & ",")
  ControlSend("[class:Notepad]", "", "Edit1", $aURL[$i][3] & @LF)
  Sleep(300)
Next
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Почему ты упорно начинаешь с $i=0
В этой строке массива находится его размер, см. описание функций
http://autoit-script.ru/autoit3_docs/libfunctions/_filelisttoarray.htm
http://autoit-script.ru/autoit3_docs/libfunctions/_filereadtoarray.htm
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
inververs : Благодарю Ваш скрипт отрабатывает на отлично, единственно что он берет данные из всех файлов по порядку, что мне не нужно. Тут одним из главных моментов это 1 запуск скрипта - добавляются файлы из одного файла. 2-й запуск - добавляются из следующего файла и так до последнего. А при добавлении последнего ini обнуляется и заново по кругу. Как то так :smile: Попробую сам до этого додуматься по крайней мере добавление с одного конкретного файла из массива сделал пока так:
Код:
#include <File.au3>
#include <Array.au3>

Local $files = _FileListToArray(@ScriptDir, '*.txt',  $FLTA_FILES, True)
If @error Then Exit MsgBox(0, 0, @ScriptLineNumber)

Run("notepad.exe")
WinWait("[class:Notepad]")

Local $file, $aData

    $file = $files[1] ; номер  файла из массива
    If Not isUsed($file) Then
        setUsed($file)
        $aData = readFile($file)
        processData($aData)
    EndIf


Func processData($aData)
    For $i = 0 To UBound($aData) - 1
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][0] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][1] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][2] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][3] & @LF)
    Next
EndFunc

Func readFile($file)
    Local $aData
    _FileReadToArray($file, $aData, $FRTA_NOCOUNT, ",")
    Return $aData
EndFunc

Func setUsed($file)
    IniWrite('data.ini', 'used', $file, 1)
EndFunc

Func isUsed($file)
    Return IniRead('data.ini', 'used', $file, 0) = 1
EndFunc



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

Vovsla сказал(а):
Почему ты упорно начинаешь с $i=0
В этой строке массива находится его размер, см. описание функций
http://autoit-script.ru/autoit3_docs/libfunctions/_filelisttoarray.htm
http://autoit-script.ru/autoit3_docs/libfunctions/_filereadtoarray.htm
Я же говорил что особо в этом не разбираюсь на вопрос что означает 0 скрипте из моего первого поста я получил следующий ответ
Код:
См. справку. Если ноль ($FRTA_NOCOUNT), то элементы массива будут отсчитываться от нуля. Если единица ($FRTA_COUNT), то в элементах $aURL[0][0] и $aURL[0][1] будет размер массива, а строки будут начинаться с единицы.
и как бы в это особо не лез :whistle:


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

Ура !!!! Добился почти желаемого :laugh: немного доработал :

Код:
Local $file, $aData
For $i = 1 To UBound($files) - 1
    $file = $files[$i]
    If Not isUsed($file) Then
        setUsed($file)
        $aData = readFile($file)
        processData($aData)
		ExitLoop
	 ElseIf isUsed($file) Then
	    Sleep (1000)

	 EndIf

Next

Таким образом производит выборку как нужно 1 запуск обрабатывает 1 файл. :smile:
Осталось совсем немного Это чтоб когда файлы закончатся ini обнулялся :scratch:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Сделай так:
Код:
Local $file, $aData
For $i = 1 To UBound($files) - 1
	$file = $files[$i]
	If isUsed($file) Then
		Sleep(1000)
	Else
		setUsed($file)
		$aData = readFile($file)
		processData($aData)
		Exit
	EndIf
Next
FileDelete('data.ini')
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Спасибо, попробую но боюсь что
Код:
FileDelete('data.ini')
будет удалять файл после каждого добавленного файла итого получится что будет добавляться один и тот же файл :( а это не есть хорошо :scratch: Но уже кое что надумал если получится то выложу если нет то опять спрошу ;D


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

Друзья !!!! Спасибо что откликнулись !!! Вы мне очень помогли! :beer:
inververs : Благодарю за Ваш вариант перебора файлов!!!
Vovsla Благодарю что кинули в меня пирожками и акцентировали моё внимание на этом долбаном "0". Который в конце концов помог найти решение последнего вопроса :beer:
Без Вас я б не справился :IL_AutoIt_1:
Итоговый скрипт может кому то пригодится:
Код:
#include <File.au3>
#include <Array.au3>

Local $files = _FileListToArray(@ScriptDir, '*.txt',  $FLTA_FILES, True)
If @error Then Exit MsgBox(0, 0, @ScriptLineNumber)

Run("notepad.exe")
WinWait("[class:Notepad]")


Local $file, $aData
For $i = 1 To UBound($files) - 1
    $file = $files[$i]
    If Not isUsed($file) Then
        setUsed($file)
        $aData = readFile($file)
        processData($aData)
		ExitLoop
	 ElseIf isUsed($file) Then
	    Sleep (1000)

	 EndIf

Next

$IniR = IniReadSection("data.ini", "used")
If  $IniR [0][0] = $files [0] Then FileDelete('data.ini')


Func processData($aData)
    For $i = 0 To UBound($aData) - 1
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][0] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][1] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][2] & ",")
      ControlSend("[class:Notepad]", "", "Edit1", $aData[$i][3] & @LF)
    Next
EndFunc

Func readFile($file)
    Local $aData
    _FileReadToArray($file, $aData, $FRTA_NOCOUNT, ",")
    Return $aData
EndFunc

Func setUsed($file)
    IniWrite('data.ini', 'used', $file, 1)
EndFunc

Func isUsed($file)
    Return IniRead('data.ini', 'used', $file, 0) = 1
EndFunc



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

inververs сказал(а):
Сделай так:
Код:
Local $file, $aData
For $i = 1 To UBound($files) - 1
	$file = $files[$i]
	If isUsed($file) Then
		Sleep(1000)
	Else
		setUsed($file)
		$aData = readFile($file)
		processData($aData)
		Exit
	EndIf
Next
FileDelete('data.ini')
Пробовал так но появляется 1 пустой запуск, что не совсем приемлемо :smile: чтоб после добавления последнего файла перейти к первому нужно прогнать один раз в холостую. Так же команда Exit не совсем уместна т.к. хочу это все засунуть в функцию для основного скрипта .
 
Верх