Что нового

Как удалить дублирующие строки?

sergeinovilozf

Новичок
Сообщения
51
Репутация
0
Здравствуйте.

Здесь на сайте нашёл код.Работает.
Код:
$sFileName = "1.txt"
$sFilePath = @ScriptDir & "\"
$sFile = $sFilePath & $sFileName

$iRet = _FileDeleteDuplicateLines($sFile, 0)
$iExtended = @extended

If $iRet = 1 And $iExtended > 0 Then
    MsgBox(64, "Results", StringFormat("В файле <%s> удалено дублирующихся строк: %i", $sFileName, $iExtended))
ElseIf $iExtended = 0 Then
    MsgBox(64, "Results", StringFormat("В файле <%s> нет дублирующихся строк.", $sFileName))
ElseIf @error = 1 Then
    MsgBox(48, "Ошибка", StringFormat("Файл <%s> не найден.", $sFileName))
ElseIf @error = 2 Then
    MsgBox(48, "Ошибка", StringFormat("Ошибка при попытке записи в Файл <%s>.", $sFileName))
EndIf

Func _FileDeleteDuplicateLines($sFile, $iCaseSense=0)
    If Not FileExists($sFile) Then Return SetError(1)
    Local $sFRead = FileRead($sFile)
    Local $aFSplit = StringSplit(StringStripCR($sFRead), @LF)
    Local $sFileContent = "", $iExtended = 0, $sLastChars = StringRight($sFRead, 2)
   
    ;Проходим весь массив, и проверяем каждую строку
    For $i = 1 To $aFSplit[0]
        If $aFSplit[$i] = "" Then ContinueLoop
       
        ;Тут делаем проверку в переменной, в которую скапливаются строки (не дублирующиеся)
        If Not StringInStr($sFileContent, $aFSplit[$i] & @CRLF, $iCaseSense) Then
            $sFileContent &= $aFSplit[$i] & @CRLF
        Else
            $iExtended += 1
        EndIf
    Next
   
    If $sLastChars <> @CRLF Then $sFileContent = StringTrimRight($sFileContent, 2)
   
    ;Пишем в файл уже без дублей
    Local $hFOpen = FileOpen($sFile, 2)
    If $hFOpen = -1 Then Return SetError(2)
   
    FileWrite($hFOpen, $sFileContent)
    FileClose($hFOpen)
   
    Return SetExtended($iExtended, 1)
EndFunc



Вот написал,намного проще:
Код:
#include <File.au3>; 
$strok=_FileCountLines("1.txt"); количество строк в файле  1
$i = 1; 
While $i <= $strok;
;--------------------
$t = 1; 
While $t <= $strok;
;----------
$nomer1 = FileReadLine ( "1.txt",  $i);  считывает строку из файла
$nomer2 = FileReadLine ( "1.txt",  $t);  считывает строку из файла
If ($nomer1=$nomer2 And $i<>$t) Then _FileWriteToLine("1.txt", $t, "", 1);  
;----------
$t = $t + 1
WEnd
;--------------------
$i = $i + 1
WEnd

Тоже удаляет дубли из цифр и текста.Зачем такой грамоздкий в первом случае?И через поисковик ничего кроме первого тогда не нашёл.Может второй вариант в каких-то случаях не сработает?
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Re: Как удалить дубли в строках?

- В вашем коде используется UDF, это увеличивает время выполнения скрипта
- В вашем коде не делается обработка ошибок/подсчет удаленных строк
- Во вложенном цикле переменная $t может быть меньше чем $i, это не имеет смысла, так как все строки с индексом меньше $i уже проверены в предыдущих итерациях
- В вашем коде $i может быть равно $t, при этом сначала читаются строки из файлов и только потом проверяется равны ли индексы этих строк

Как-то так :scratch:
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
FileReadLine
Справка сказал(а):
С точки зрения производительности, использовать эту функцию в цикле, увеличивая параметр line на 1 при в каждом шаге цикла - является плохой идеей. Это заставляет AutoIt перечитывать файл с самого начала до указанной строки
Тоже относиться и к _FileCountLines/_FileWriteToLine
 
Верх