Что нового

Ускорить запись текста из массива в файл

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Всем доброго времени суток.

Имеется два массива, в первом массиве текстовой файл поделенный на строки:
Код:
массив[строка 1]
массив[строка 2]
массив[строка 3]

А вот втором массиве находятся номера строк, которые нужно исключить:
Код:
массив2[2]
массив2[1]

Т.Е исключаем 2 и 1 строку.

И все это дело необходимо обработать с записью в файл, вот что у меня получилось:
Код:
While 1
	  If IsArray($массив2) Then
		 $del_search = _ArraySearch($массив2,$index)
		 If $del_search = -1 Then 
			FileWriteLine($fixmap,массив[$index])
		 EndIf
	  Else
		 FileWriteLine($fixmap,массив[$index])
      EndIf		 
	  If $MapLines - 1 = $index Then ExitLoop
	  $index += 1   
   WEnd

Но вот это дело очень сильно грузит ЦП и обрабатывает файл минут 20(это при условии, если исключенных строк более 1000 в файле с (более 24000 строк)).
Насколько я понял, это дело в функции _ArraySearch, долго обрабатывает большие массивы.

Есть предложения по упрощению этого процесса?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
firex
Есть предложения по упрощению этого процесса?
Есть.
1. Для чего _ArraySearch? Номера/индексы известны, наверное нужно просто прогнать массив индексов исключения (For...Next).
2. Для чего в цикле проверка массива IsArray? Разве одного раза недостаточно, чтоб понять что это массив?
3. После Else, если не массив, то записываем ячейку массива. Как? Если это не массив
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
AZJIO, Да уже голова не думала, готовил срочный апдейт.
Вот в чем дело:
1)Программа загружает в массив текстовой документ.
2)Далее проверяет строчки по фильтру и если нужно добавляет их порядковый номер в массив(горячее удаление невозможно сделать, так как идет в несколько ступеней).
3)Далее запускает сохранение как я уже описал в первом посте.

AZJIO [?]
Для чего в цикле проверка массива IsArray? Разве одного раза недостаточно, чтоб понять что это массив?
Уже исправил, не заметил :3

Номера/индексы известны, наверное нужно просто прогнать массив индексов исключения (For...Next).
Немного не понимаю вас =\

После Else, если не массив, то записываем ячейку массива. Как? Если это не массив
Это всегда массив(массив 1) - текстовой документ.
А на счет второго массива, если он не массив - исключаемых строк нет.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
firex
Код:
Dim $aArray[100]
For $s = 0 To 99
	$aArray[$s] = "String " & $s
Next

Dim $aArray2[Random(10, 90, 1)]
For $d = 0 To Ubound($aArray2) - 1
	$aArray2[$d] = Random(0, 99, 1)
Next

For $i = 0 To Ubound($aArray2) - 1
	$aArray[$aArray2[$i]] = "" ; очищаем строки в массиве $aArray, согласнно номерам строк указанных в массиве $aArray2
Next
; _ArrayDisplay($aArray)

$aArray = _ArrayClearEmpty($aArray) ; очищаем массив $aArray от пустых строк
; _ArrayDisplay($aArray)

_FileWriteFromArray(@ScriptDir & "\000.txt", $aArray) ; записсываем массив $aArray в фаил


Func _ArrayClearEmpty($a_Array, $i_SubItem = 0, $i_Start = 0)
    If Not IsArray($a_Array) Or UBound($a_Array, 0) > 2 Then Return SetError(1, 0, 0)

    Local $i_Index = -1
    Local $i_UBound_Row = UBound($a_Array, 1) - 1
    Local $i_UBound_Column = UBound($a_Array, 2) - 1

    If $i_UBound_Column = -1 Then $i_UBound_Column = 0
    If $i_SubItem > $i_UBound_Column Then $i_SubItem = 0
    If $i_Start < 0 Or $i_Start > $i_UBound_Row Then $i_Start = 0

    Switch $i_UBound_Column + 1
        Case 1
            Dim $a_TempArray[$i_UBound_Row + 1]
            If $i_Start Then
                For $i = 0 To $i_Start - 1
                    $a_TempArray[$i] = $a_Array[$i]
                Next
                $i_Index = $i_Start - 1
            EndIf
            For $i = $i_Start To $i_UBound_Row
                If String($a_Array[$i]) Then
                    $i_Index += 1
                    $a_TempArray[$i_Index] = $a_Array[$i]
                EndIf
            Next
            If $i_Index > -1 Then
                ReDim $a_TempArray[$i_Index + 1]
            Else
                Return SetError(2, 0, 0)
            EndIf
        Case 2
            Dim $a_TempArray[$i_UBound_Row + 1][$i_UBound_Column + 1]
            If $i_Start Then
                For $i = 0 To $i_Start - 1
                    For $j = 0 To $i_UBound_Column
                        $a_TempArray[$i][$j] = $a_Array[$i][$j]
                    Next
                Next
                $i_Index = $i_Start - 1
            EndIf
            For $i = $i_Start To $i_UBound_Row
                If String($a_Array[$i][$i_SubItem]) Then
                    $i_Index += 1
                    For $j = 0 To $i_UBound_Column
                        $a_TempArray[$i_Index][$j] = $a_Array[$i][$j]
                    Next
                EndIf
            Next
            If $i_Index > -1 Then
                ReDim $a_TempArray[$i_Index + 1][$i_UBound_Column + 1]
            Else
                Return SetError(2, 0, 0)
            EndIf
    EndSwitch
    Return SetError(0, $i_UBound_Row - $i_Index, $a_TempArray)
EndFunc   ;==>_ArrayClearEmpty
 
Верх