Что нового

[Данные, строки] Суммирование отдельных элементов массива в цикле

Pat4005

Новичок
Сообщения
85
Репутация
4
Версия AutoIt: 3.3.6.1

Описание: Не получается вычислить сумму отдельных элементов одномерного массива который формируется из строки функцией StringSplit при том условии, что строки перебираются в цикле.
Код:
$zoneAmount=6
$ZstringNumPar=17
Global $array[$ZstringNumPar]
Global $ZONA[$zoneAmount]
$file=FileOpen("D:\Z_64374_120329.01", 0)
$iIND = 0
While $iIND <> -1
	$line = FileReadLine($file,1);<---- Считываем каждую строку по очереди
	$array = StringSplit($line,",");Присваиваем массиву всю строку
	If $array[17]=0 Then
		$ZONA[0]=$ZONA[0]+1 ; Увеличиваем значение элемента №0 на один при условии что 17-цатый элемент другого массива равен 0
	$iIND = @error;<---- Проверяем, не конец ли файла, если конец, то скрипт завершается
	EndIf
Wend
FileClose($file)
MsgBox(0,"",$ZONA[1])


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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
В AutiIt индексы массивов начинаются с нуля.
Если ты объявляешь массив
Код:
Global $array[17]

то максимальный элемент массива будет
Код:
$array[16]


А ты пытаешься взять элемент с индексом 17
Код:
If $array[17]=0 Then



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

И второе место:
тут вообще нельзя предсказать сколько элементов будет в массиве
Код:
$array = StringSplit($line,",");Присваиваем массиву всю строку


А ты упорно берёшь 17-ый элемент...
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
#include <Array.au3>

Global $Array, $Zona[1] = [0]

$hFile = FileOpen(@ScriptDir & '\Z_64374_120329.01.txt')
While 1
    $line = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
    $Array = StringSplit($line, ',')
    If ($Array[17] = 0) Then
        ReDim $Zona[UBound($Zona) + 1]
    EndIf
Wend
FileClose($hFile)
_ArrayDisplay($Zona)


При условии что файл для прочтения должен выглядеть вроде этого:

Код:
80,1,2,6,8,25,42,5,43,63,$2,54,20,65,67,lk,-909,0,789,678,90  - здесь 17й символ после "," = 0
65,89,435,hjgj,87,e44,97u,ft5,9j,089,45,97,789,87,76,65,54,34 - здесь 17й символ после "," не равен нулю
65,89,435,hjgj,87,e44,97u,ft5,54,20,65,67,lk,-909,0,789,0,90  - здесь 17й символ после "," = 0

И Вы получите массив $Zona в котором будет всего 2 ячейки 0 и 1
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Victor1703, не работает твой вариант!. или я опять что-то напутал.. снова как и раньше пишет "Array variable has incorrect number of subscripts or subscript dimension range exceeded".
P.S. уже сроки поджимают. попросил друг сделать скриптик который будет извлекать из специальных файлов определенные данные разделенные запятыми, чтобы получить статистику, которая должна формироваться в виде отчета, который формирует СУБД, которая не доступна в данный момент..
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Покажите ваш файл с которого вы извлекаете данные.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
$zoneAmount=6
Global $ZONA[$zoneAmount]
$file=FileOpen("D:\Z_64374_120329.01", 0)
$iIND = 0
While $iIND <> -1
    $line = FileReadLine($file,1);<---- Считываем каждую строку по очереди
	$iIND = @error;<---- Проверяем, не конец ли файла, если конец, то скрипт завершается
    $array = StringSplit($line,",");Присваиваем массиву всю строку
    If ($array[0] >= 17) And (int($array[17])=0) Then $ZONA[0]=$ZONA[0]+1 ; Увеличиваем значение элемента №0 на один при условии что 17-цатый элемент другого массива равен 0
Wend
FileClose($file)
MsgBox(0,"",$ZONA[0])
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
Выбрать нужно будет 11, 17 и возможно 10 а потом каждый из них суммировать в отдельную переменную или в файл в таком же виде по мере перебора строчек, чтобы на каждый элемент массива зона приходилось число проходов различного вида(10,11,17)
2,6,7,52,0,9194,1950,0,0,3,0,1,0,99,0,4,3
1,6,7,53,0,9194,1951,0,0,3,2,1,0,99,0,4,3
1,6,7,53,0,9194,1949,0,0,3,0,1,0,99,0,4,3
1,5,7,53,0,9194,1952,0,0,3,2,1,0,99,0,4,1
1,6,7,54,0,9194,1953,0,0,3,0,1,0,99,0,4,0
1,6,7,57,0,9194,1954,0,0,3,2,1,0,99,0,4,3
1,6,9,14,0,9194,1975,0,0,3,0,1,0,99,0,4,3
1,6,9,15,0,9194,1979,0,0,3,0,1,0,99,0,4,2
1,6,9,15,0,9194,1974,0,0,3,0,1,0,99,0,4,3
1,6,9,15,0,9194,1973,0,0,3,0,1,0,99,0,4,3
1,6,9,15,0,9194,1978,0,0,3,2,1,0,99,0,4,0
1,6,11,23,0,9194,2003,0,0,3,0,1,0,99,0,4,3
1,6,11,24,0,9194,2004,0,0,3,0,1,0,99,0,4,3
1,6,11,28,0,9194,2005,0,0,3,2,1,0,99,0,4,1
1,6,11,30,0,9194,1977,0,0,3,2,1,0,99,0,4,3
1,6,11,39,0,9194,1966,0,0,4,2,1,0,99,0,4,0
0,8,11,39,0,9194,1966,0,0,4,2,1,0,99,0,4,0
1,5,11,39,0,9194,1965,0,0,4,2,1,0,99,0,4,0
0,8,11,40,0,9194,1965,0,0,4,2,1,0,99,0,4,0
1,3,12,1,0,9040,6247,0,0,4,2,1,0,99,0,4,5
0,1,12,1,0,9040,6242,0,0,3,0,1,0,99,0,4,5
0,1,12,2,0,9040,6251,0,0,3,2,1,0,99,0,4,5
0,1,12,2,0,9040,6253,0,0,3,1,1,0,99,0,4,5
0,1,12,4,0,9040,6225,0,0,3,2,1,0,99,0,4,5
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <file.au3>
Dim $aRecords
$zoneAmount=6
$ZstringNumPar=17
Global $array[$ZstringNumPar]
Global $ZONA[$zoneAmount]

If Not _FileReadToArray("D:\Z_64374_120329.01",$aRecords) Then
   MsgBox(4096,"Ошибка", " Ошибка чтения файла в массив. @error=" & @error)
   Exit
EndIf
For $i = 1 to $aRecords[0]
	$a = StringSplit($aRecords[$i],",") ; Присваиваем массиву всю строку
    If $a[17]=0 Then  $ZONA[0] += 1 ; Увеличиваем значение элемента №0 на один при условии что 17-цатый элемент другого массива равен 0
Next
MsgBox(0,"",$ZONA[0])
 
Верх