Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
ещё небольшой вопрос
примерно так... Пара замечаний - во-первых, оператор "=" (для целых строк) в отличие от StringInStr (для вхождений) дружит с русским языком и это хорошо... во-вторых, строки с дополнительными пробелами в конце/начале строк будут рассматриваться как различные, если это не устраивает нужно применить функцию StringStripWS.
Код: Выделить весь код
#include <File.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем массив из дублирующихся записей
$DupLines = _DupsInArray ($FileLines)
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
	; Рабочий массив для отметок удаляемых записей
	Local $DelFlags [$FileLines [0] +1]
	For $i=1 To $DupLines [0][0]
		; расчитываем номер строки для удаления
		$delNum = $DupLines [$i][0] - 3
		; отмечаем кандидата на удаление в массиве
		$DelFlags [$delNum] = 1
	Next
	; Собственно цикл удаления
	For $i = $FileLines [0] To 1 Step -1
		If $DelFlags [$i] = 1 Then
			_FileWriteToLine ($File, $i, "", 1)
		EndIf
	Next
EndIf

; Возвращает двумерный массив со счетчиком, содержащий только дубли
Func _DupsInArray (ByRef $array)
	Local $i, $i, $res [1][2] = [[0,0]]
	; рабочий массив для отметки обработанных дублей
	Local $flags [$array [0] +1]
	For $i=1 To $array [0]
		For $j=$i+1 To $array [0]
			If $flags [$j] <> 1 Then
				If $array [$i] = $array [$j] Then
					ReDim $res [$res [0][0]+2][2]
					$res [0][0] = $res [0][0] +1
					$res [$res [0][0]][0] = $j
					$res [$res [0][0]][1] = $array [$j]
					$flags [$j] = 1
				EndIf
			EndIf
		Next
	Next
	Return $res
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:21, 07-11-2006 | #449