Что нового

[Математика] сложение значений из файла

andreitrane

Новичок
Сообщения
141
Репутация
3
почему при выполнении скрипта, тот сначала выводит правильное значение, а потом только 0?
Код:
Global $tid = 1
For $s = 1 to 5
	$tsum = 0
For $i = 1 to 19
$Response = FileRead(@ScriptDir&"\321.txt")
$korchtalent = StringRegExpReplace($Response, '(?s).*?<talent id="'&$tid&'">(\d+)</talent>?.*', '\1')
if not $korchtalent Then
	$tid += 1
Else
	$tsum = $tsum + $korchtalent
	$tid += 1
EndIf
Next
MsgBox(0, "", $tsum)
Next


всего в файле может быть от 0 до 19 значений
вот примерный файл
Код:
                <talent id="5">10</talent>
            
            
                <talent id="3">12</talent>
            
            
                <talent id="1">1</talent>
            
            
                <talent id="7">2</talent>
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$tsum = $tsum + Number($korchtalent)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
andreitrane
Moжно так попробовать:
Код:
#include <Array.au3>

$sString = FileRead(@ScriptDir & '\321.txt')

$aSearch = StringRegExp($sString, '">(\d+)', 3)
If Not @error Then
	Dim $aRes[UBound($aSearch) + 1][2]
	$aRes[0][0] = UBound($aSearch)
	For $i = 1 To $aRes[0][0]
		;$aRes[0][0] - кол-во найденных чисел
		;$aRes[$i][0] - найденное число
		;$aRes[$i][1] - сумма по нарастающей
		$aRes[$i][0] = Number($aSearch[$i - 1])
		$aRes[$i][1] = $aRes[$i - 1][1] + $aRes[$i][0]
	Next
	_ArrayDisplay($aRes)
Else
	MsgBox(16, 'Error', 'Нет')
EndIf

Или так:
Код:
#include <Array.au3>

$sString = FileRead(@ScriptDir & '\321.txt')

$aSearch = StringRegExp($sString, 'id="\d+">\d+', 3)
If Not @error Then
	Dim $aRes[UBound($aSearch) + 1][3]
	$aRes[0][0] = UBound($aSearch)
	For $i = 1 To $aRes[0][0]
		;$aRes[0][0] - кол-во найденных чисел
		;$aRes[$i][0] - id
		;$aRes[$i][1] - найденное число
		;$aRes[$i][2] - сумма по нарастающей
		$aRes[$i][0] = StringRegExpReplace($aSearch[$i - 1], '>.*$|"', '')
		$aRes[$i][1] = Number(StringRegExpReplace($aSearch[$i - 1], '^.*>', ''))
		$aRes[$i][2] = $aRes[$i - 1][2] + $aRes[$i][1]
	Next
	_ArrayDisplay($aRes)
Else
	MsgBox(16, 'Error', 'Нет')
EndIf
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
andreitrane [?]
а потом только 0?
это при следующем запуске, или как ? что значит "потом" ?
В идеале желательно сначала FileOpen в требуемом режиме, потом FileRead, потом FileClose
т.е. файл занимается процессом, считывается и высвобождается... так принято.
Код:
$TagertFile = FileOpen($FileName, 16) ; где $FileName например некий C:\test.txt
$FileBytes = FileRead($FileName, FileGetSize($FileName)) ; считываем
FileClose($TagertFile) ; закрываем

попробуйте...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
RUVATA [?]
1. если считывается не весь файл
2. если файл надо считать в особой кодировке или бинарном режиме.

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


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

andreitrane [?]
RUVATA [?]
в контексте проблемы ТС это ничего не даст.
его проблема в составлении регвыра для всего текста. не проверял, но думаю, надо делать так, как показал madmasles
 
Автор
A

andreitrane

Новичок
Сообщения
141
Репутация
3
RUVATA [?]
это при следующем запуске, или как ? что значит "потом" ?
ну вы сами попробуйте запустить скрипт и сами поймете...
я сделал так, чтобы скрипт складывал значения из файла 5 раз и 5 раз он должен вывести в msgboxe одно и то же значение, но почему то он сначало выводит правильное значение, а в остальных msgbox'ах выводит 0


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

Kaster [?]
но думаю, надо делать так, как показал madmasles
нет, его пример не подойдет, он показывает только 1 раз, а надо чтобы он несколько раз просматривал файл и каждый раз выводил сумму всех значений (просто по идее значения в файле каждый раз меняютсяи мне надо просматривать сумму значений, но для примера сойдет и один файл, главное только чтобы срипт несколько раз вывел из него значения...)
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
andreitrane [?]
каждый раз меняютсяи мне надо просматривать сумму значений,
Тогда вы избрали неправильную тактику...
Вы должны опираться на изменение файла, т.е. создать обработчик который будет реагировать на изменение целевого файла... а так-же позаботится о том, чтобы во время сеансов чтения не возбуждались функции записи (которые меняют значения в файле) в противном случае получите CPP скорее всего...
PS: К тому-же если размеры файла довольно велики надо позаботится и о фрагментированности.

посмотрите здесь уже обсуждалось
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
andreitrane [?]
он показывает только 1 раз, а надо чтобы он несколько раз
Код:
#include <Array.au3>
;$j = 0
;While 1 ;бесконечно
;$j += 1
For $j = 1 To 5 ;5 раз
	$sString = FileRead(@ScriptDir & '\321.txt')
	$aSearch = StringRegExp($sString, 'id="\d+">\d+', 3)
	If Not @error Then
		Dim $aRes[UBound($aSearch) + 1][3]
		$aRes[0][0] = UBound($aSearch)
		For $i = 1 To $aRes[0][0]
			;$aRes[0][0] - кол-во найденных чисел
			;$aRes[$i][0] - id
			;$aRes[$i][1] - найденное число
			;$aRes[$i][2] - сумма по нарастающей
			$aRes[$i][0] = StringRegExpReplace($aSearch[$i - 1], '>.*$|"', '')
			$aRes[$i][1] = Number(StringRegExpReplace($aSearch[$i - 1], '^.*>', ''))
			$aRes[$i][2] = $aRes[$i - 1][2] + $aRes[$i][1]
		Next
		_ArrayDisplay($aRes, $j)
	Else
		MsgBox(16, 'Error', 'Нет')
	EndIf
	Sleep(3000);каждые 3 секунды
Next
;WEnd
 
Автор
A

andreitrane

Новичок
Сообщения
141
Репутация
3
RUVATA [?]
Вы должны опираться на изменение файла, т.е. создать обработчик который будет реагировать на изменение целевого файла...
мне это не надо
дело в том, что программа поидее должна обрабатывать входящий пакет, но для примера вполне сойдет и обычный txt файл
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
andreitrane [?]
должна обрабатывать входящий пакет
^__^ так-же своя специфика... модель работы с файлом врядли Вам подойдет;
опять-же что за пакет, по какому протоколу, модель (синхронная, асинхронная)
на этом форуме темам клиент-серверных приложений уделено довольно большо количество тем - в них вы найдете исчерпывабщие ответы на насущьные вопросы
 
Автор
A

andreitrane

Новичок
Сообщения
141
Репутация
3
RUVATA [?]
модель работы с файлом врядли Вам подойдет
все отлично подходит, делаю клиент для игры в контакте, там входяшие пакеты с обычной незакодированной инфой, ничего особенного там не надо, чтение инфы идентично чтению из txt файла
 
Верх