2016-09-09 7 views
1

Я работаю над скриптом AutoIt, который будет принимать текстовый файл. Текстовый файл состоит из серии результатов теста в группах по 5 строк. Этот скрипт должен пройти через файл и вывести средний балл для каждой группы. оценка отображается после 11-го «,». Например, с этим файлом образца:Функция AutoIt _ArraySort (..) не сортируется правильно

a,a,a,a,a,a,a,a,a,a,100.2 
a,a,a,a,a,a,a,a,a,a,300.2 
a,a,a,a,a,a,a,a,a,a,160.2 
a,a,a,a,a,a,a,a,a,a,301.2 
a,a,a,a,a,a,a,a,a,a,161.2 

b,b,b,b,b,b,b,b,b,b,110.5 
b,b,b,b,b,b,b,b,b,b,87.5 
b,b,b,b,b,b,b,b,b,b,89.5 
b,b,b,b,b,b,b,b,b,b,190.5 
b,b,b,b,b,b,b,b,b,b,170.5 

c,c,c,c,c,c,c,c,c,c,90.2 
c,c,c,c,c,c,c,c,c,c,190.2 
c,c,c,c,c,c,c,c,c,c,40.2 
c,c,c,c,c,c,c,c,c,c,20.2 
c,c,c,c,c,c,c,c,c,c,80.2 

Я ожидаю медианные счеты 161,2, 110,5 и 80,2 для групп А, В и С соответственно. Тем не менее, выходной результат заключается в следующем:

median is = 161.2 ----- sorted array : 100.2 , 160.2 , 161.2 , 300.2 , 301.2 
median is = 190.5 ----- sorted array : 110.5 , 170.5 , 190.5 , 87.5 , 89.5 
median is = 40.2 ----- sorted array : 190.2 , 20.2 , 40.2 , 80.2 , 90.2 

Первая группа получает отсортирован правильно, но после этого массива больше не сортируются. И это несмотря на то, что _ArraySort(...) вызывается непосредственно перед выходом. Любая идея, почему это может произойти?

Код выглядит следующим образом:

Func CondenseResults() 

    $size = 5 ;temporary, variable to be passed on from other function 

    $gameDetail = "" 
    $rawResult = "D:\RTG_Benchmark\results\results.txt" 
    local $openResults = FileOpen("D:\RTG_Benchmark\results\results2.txt", 1) 
    Local $i = 1 
    Local $j = 0 
    Local $spaceCount = 0 
    Local $score[$size] 
    Local $runMultiplier[2]  ; 0 = previous, 1 = current 
    Local $subString 

    Do 
     $resultLine = FileReadLine($rawResult, $i)  ; read line from raw result 
     $subString = StringSplit($resultLine,",") ; split 
     If StringLen($resultLine) = 0 Then 
      $spaceCount += 1 
      $j = 0 
      FileWriteLine ($openResults, "" & @CRLF) 
     Else 
      $gameDetail = $subString[1] & $subString[2] & $subString[3] & $subString[4] & $subString[5] & $subString[6] & $subString[7] & $subString[8] & $subString[9] & $subString[10]  ; substring 1 - 10 
      $runMultiplier[1] = $gameDetail 
      If $i = 1 Then  ; 
       $score[$j] = $subString[11] 
      Else 
       If $runMultiplier[1] <> $runMultiplier[0] Then 
        $j = 0 
        $score[$j] = $subString[11] 
       Else 
        $j += 1 
        If $j >= $size Then 
         $j = 0 
        EndIf 
        $score[$j] = $subString[11] 
       EndIf 

       $resultLine = FileReadLine($rawResult, $i+1) 
       $subString = StringSplit($resultLine,",") ; split 

       If StringLen($resultLine) = 0 Or $gameDetail <> $subString[1] & $subString[2] & $subString[3] & $subString[4] & $subString[5] & $subString[6] & $subString[7] & $subString[8] & $subString[9] & $subString[10] Then 

         _ArraySort($score, 0,0,0,0,1) 
         ConsoleWrite("median is = " & ($score[$size/2] & " ----- sorted array : " & $score[0] & " , " & $score[1] & " , " & $score[2] & " , " & $score[3] & " , " & $score[4]& @CRLF)) 
         $j = 0 
       EndIf 


      EndIf 
     EndIf 
     $i += 1 
     $runMultiplier[0] = $runMultiplier[1] 
    Until $i >=_FileCountLines($rawResult) 

    $j += 1 
    $score[$j] = $subString[11] 
    _ArraySort($score) 
    ConsoleWrite("median is =" & ($score[$size/2] & " ----- sorted array : " & $score[0] & " , " & $score[1] & " , " & $score[2] & " , " & $score[3] & " , " & $score[4]& @CRLF)) 


    FileClose($openResults) 
    sleep(100000) 
    Return 0 
EndFunc 

ответ

1

Я нашел этот вопрос. AutoIt обрабатывал числа как строки и сортировал их по одной цифре за раз слева направо.

Number() функция позаботилась об этой проблеме.

+0

но где именно вы использовали этот номер()? – McVitas