Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Получение и обработка информации из текстового файла (http://forum.oszone.net/showthread.php?t=150204)

ya158 10-09-2009 20:39 1216037

Получение и обработка информации из текстового файла
 
Есть текстовый файл. Каждая строка этого файла состоит из одного ил двух целых чисел, разделлённых табуляцией(или запятой, пробелом и т.д. - неважно). Разделитель известен заранее. То есть, например:

12345,2
67890,4
23456
34535,5

Если второго числа нет, то оно приравнивается к единице. Количество строк заранее не известно.

Задача: Из скрипта вызывать внутреннюю подпрограмму, в качестве аргументов для которой выступает пара чисел из строки. Подпрограмма вызывается для каждой строки по очереди. Общее количество строк заранее не известно.

Так же было бы неплохо в начале этого текстового файла прописать несколько текстовых строк, которые в скрипте присвоились бы переменным. Например:

в текстовом файле
файл1.ехе
файл2.ехе
;Тут пустая строка
12345,2
67890,4
23456
34535,5

в скрипте следующая обработка
Х1=файл1.ехе
Х1=файл1.ехе
запуск Х1
запуск Х2
обработка массива строк из двух цифр

Помогите написать такой скрипт. Заранее спасибо.

kaster 10-09-2009 20:56 1216049

Код:

$sPath = 'd:\1.txt';<--- Путь до текстового файла с числами
$sSep = '@TAB';<--- Разделитель, раскоментировать/дописать нужный, закоментировать остальные
;$sSep = ' '
;$sSep = ';'
;$sSep = ','

$sAppPath = 'c:\1.exe';<--- Путь до программы для запуска с ключами
$hFile = FileOpen($sPath, 0);<--- Открываем файл для чтения
$iIND = 1;<--- Индикатор выхода из цикла
While $iIND <> -1;<--- Цикл
    $sLine = FileReadLine($hFile);<--- Считываем файл строка за строкой
    $iIND = @error;<--- Проверяем не конец ли файла
    $aLine = StringSplit($sLine, $sSep);<--- Разделяем строку разделителем
    If $aLine[0] = 1 Then;<--- Проверка на наличие второго числа (отсутствие)
        $iParam1 = $aLine[1];<--- Первый параметр
        $iParam2 = 1;<--- Второй параметр
    Else;<--- Проверка на наличие второго числа (присутствие)
        $iParam1 = $aLine[1];<--- Первый параметр
        $iParam2 = $aLine[2];<--- Второй параметр
    EndIf
    RunWait(@ComSpec & ' /c "' & $sAppPath & '" ' & $iParam1 & ' ' & $iParam2);<--- Запуск программы с ключами.
WEnd

Честно говоря не понял про вторую часть.

ya158 10-09-2009 21:49 1216096

kaster,
Огромное спасибо.

Вместо
Код:

RunWait(@ComSpec & ' /c "' & $sAppPath & '" ' & $iParam1 & ' ' & $iParam2)
вставил
Код:

  MsgBox ( 0, $iIND, $iParam1 & $iParam2)
файл 1.txt содержит 4 строки. 4 сообщения выскочило ожидаемых, а затем выскочило пятое сообщение с заголовком "-1" (то есть iIND=-1) и текстом "1" (то есть, по видимому, либо iParam1=1, либо iParam2=1). То есть функция будет вызываться не 4 раза, а 5, причём пятый раз с ненужными параметрами. Или я в чём-то не прав?

Цитата:

Цитата kaster
Честно говоря не понял про вторую часть. »

Файл d:\1.txt начинается со строк, содержащих имена файлов. Например: notepad.exe и d:\1.exe. Далее идёт пустая строка. А затем идут пары чисел:
Код:

 
notepad.exe
d:\1.exe

12345,2
67890,4
23456
34535,5

Скрипт сначала из первой строки узнаёт имя первого файла (notepad.exe) и присваивает его какой-либо переменной (допустим Х1), затем узнаёт имя второго файла (d:\1.exe) и присваивает его следующей переменной (Х2). Таких имён файлов может быть несколько. Затем обнаруживается пустая строка и скрипт, например, запускает notepad.exe (узнаёт из переменной Х1) и присваивает sAppPath из твоего примера значение Х2 (то есть d:\1.exe). То есть выполняются каки-либо действия. После этого запускается твой скрипт и обрабатываются пары чисел.
Надеюсь сейчас объяснил более понятно.
Заранее спасибо за помощь

kaster 11-09-2009 01:24 1216228

Цитата:

Цитата ya158
То есть функция будет вызываться не 4 раза, а 5, причём пятый раз с ненужными параметрами. Или я в чём-то не прав? »

да. ты прав. я нет
у меня, к сожалению, часто такие ошибки проскакивают с +- 1 на цикле :(
вот правильный код
Код:

$sPath = 'd:\1.txt';<--- Путь до текстового файла с числами
;$sSep = '@TAB';<--- Разделитель, раскоментировать/дописать нужный, закоментировать остальные
;$sSep = ' '
;$sSep = ';'

$sSep = ','
$sAppPath = 'c:\1.exe';<--- Путь до программы для запуска с ключами
$hFile = FileOpen($sPath, 0);<--- Открываем файл для чтения
$iIND = 1;<--- Индикатор выхода из цикла
While 1;<--- Цикл
    $sLine = FileReadLine($hFile);<--- Считываем файл строка за строкой
    $iIND = @error;<--- Проверяем не конец ли файла
    If $iIND = -1 Then ExitLoop;<--- Если конец, дальще не обратаываем файл
    $aLine = StringSplit($sLine, $sSep);<--- Разделяем строку разделителем
    If $aLine[0] = 1 Then;<--- Проверка на наличие второго числа (отсутствие)
        $iParam1 = $aLine[1];<--- Первый параметр
        $iParam2 = 1;<--- Второй параметр
    Else;<--- Проверка на наличие второго числа (присутствие)
        $iParam1 = $aLine[1];<--- Первый параметр
        $iParam2 = $aLine[2];<--- Второй параметр
    EndIf
    MsgBox ( 0, $iIND, 'iparam1 = ' & $iParam1 & @CRLF & 'iparam = ' & $iParam2)
    ;RunWait(@ComSpec & ' /c "' & $sAppPath & '" ' & $iParam1 & ' ' & $iParam2);<--- Запуск программы с ключами.
WEnd

Цитата:

Цитата ya158
Так же было бы неплохо в начале этого текстового файла прописать несколько текстовых строк, которые в скрипте присвоились бы переменным. Например: »

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


Время: 21:59.

Время: 21:59.
© OSzone.net 2001-