Войти

Показать полную графическую версию : Получение и обработка информации из текстового файла


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

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
$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
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, причём пятый раз с ненужными параметрами. Или я в чём-то не прав?

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

Файл 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
То есть функция будет вызываться не 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
Так же было бы неплохо в начале этого текстового файла прописать несколько текстовых строк, которые в скрипте присвоились бы переменным. Например: »
Если это нужно делать до того как выполнится скрипт, то нужно открыть вначале файл для чтения, скопировать содержимое в другой файл или б.обмена, закрыть файл, снова открыть для записи с флагом перезаписи, записать нужные строки, добавить пустую строку, открыть другой файл, взять содержимое поместить снова в первый файл, закрыть второй файл, закрыть первый файл, открыть первый файл на чтения и провести вышеописанные манипуляции. если я правильно конечно понял.




© OSzone.net 2001-2012