1

Тема: AHK: Повтор строк

Как сделать такой скрипт, который будет убирать повторяющиеся строки из файла?

Как сказал мой дед - Я твой дед

2

Re: AHK: Повтор строк

Читаем файл построчно. Записываем содержимое текущей строки в переменную. Читаем следующу строку; если её содержимое совпадает со значением любой из переменных, то переходим к следующей строке; иначе записываем её содержимое во вторую переменную. И так далее. Когда файл закончится, последовательно считать все переменные и записать их содержимое в файл.

3

Re: AHK: Повтор строк

А можно проще.

FileRead, Text, Source.txt
Sort, Text, U
FileAppend, %Text%, Target.txt

4

Re: AHK: Повтор строк

Malcev
Так не лучше:


Text =
( 
строка 2
строка 1
строка 1
строка 2
строка 1
)
Sort, Text, U
MsgBox % Text

Надо (по идее):


строка 2
строка 1

А получается:


строка 1
строка 2

Но в частных случаях может подойти.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Повтор строк

Да, я вот тоже вспомнил про Sort и подумал, что неплохо бы там иметь опцию чисто удаления повторов, без сортировки.

6 (изменено: serzh82saratov, 2013-11-08 18:00:52)

Re: AHK: Повтор строк

ypppu пишет:

если её содержимое совпадает со значением любой из переменных

Я бы сделал без (псевдо) массивов:


Text =
( 
строка 2
строка 1
строка 1
строка 2
строка 1
)
 ; 1 вариант
Loop, Parse, Text, `n
    OutText .= OutText ~= "m`a)^\Q" A_LoopField "\E$" ? "" : A_LoopField "`n"  
MsgBox % SubStr(OutText, 1, -1) 
 ; 2 вариант наверное быстрее первого
OutText = `n
Loop, Parse, Text, `n
    OutText .= Instr(OutText, "`n" A_LoopField "`n") ? "" : A_LoopField "`n"   
MsgBox % SubStr(OutText, 2, -1) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: Malcev, 2013-11-08 20:32:05)

Re: AHK: Повтор строк

serzh82saratov, вот любите вы все усложнять - получаем меньшее количество строк, а код очень тяжело для новичка читаем.

Text =
( 
строка 2
строка 1
строка 1
строка 2
строка 1
)
Loop, Parse, Text, `n
{
   If NewText not contains %A_LoopField%`n
      NewText .= A_LoopField . "`n"
}
msgbox % NewText

8 (изменено: serzh82saratov, 2013-11-08 20:47:22)

Re: AHK: Повтор строк

вот любите вы все усложнять

Если новичку интересно, то мне не трудно объяснить. пруф.

----------

В вашем нерабочем:


Text =
( 
А где же следующая строка? строка 2
строка 2
строка 1
строка 1
строка 1
)
Loop, Parse, Text, `n
{
   If NewText not contains %A_LoopField%`n
      NewText .= A_LoopField . "`n"
}
msgbox % NewText

варианте надо ещё удалять последний перевод строки, которого нет в оригинале.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: serzh82saratov, 2013-11-08 21:01:19)

Re: AHK: Повтор строк

код очень тяжело для новичка читаем.

Ну тогда выражения:

NewText .= A_LoopField . "`n"

это зло:

NewText = %NewText%%A_LoopField%`n 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Повтор строк

Вот исправленный вариант.

Text =
( 
А где же следующая строка? строка 2
строка 2
строка 1
строка 1
строка 1
)
Loop, Parse, Text, `n
{
   If NewText not contains `n%A_LoopField%`n
      NewText .= A_LoopField . "`n"
}
msgbox % trim(NewText)

11

Re: AHK: Повтор строк

Наверное так:

trim(NewText, "`n")

исправленный вариант

Вы невнимательно пытаетесь переделать мой 2 вариант?


Text =
( 
строка 2
строка 2 
строка 1 
строка 1 
строка 1  
)
Loop, Parse, Text, `n
{
   If NewText not contains `n%A_LoopField%`n
      NewText .= A_LoopField . "`n"
}
msgbox % trim(NewText)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Повтор строк

Нет. Долблю свой.

Text =
( 
строка 2
строка 2 
строка 1 
строка 1 
строка 1
)
Text := "`n" . Text
Loop, Parse, Text, `n
{
   If NewText not contains `n%A_LoopField%`n
      NewText .= A_LoopField . "`n"
}
msgbox % trim(NewText, "`n")

13 (изменено: serzh82saratov, 2013-11-08 22:23:02)

Re: AHK: Повтор строк

А если нужен учёт пустых строк в начале и конце?


Text =
( 

строка 2
строка 2  
строка 1 
строка 1 
строка 1
 
)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14 (изменено: Malcev, 2013-11-08 23:43:56)

Re: AHK: Повтор строк

Наверное как-то с помощью RegexReplace.

15

Re: AHK: Повтор строк

Наверное как-то с помощью RegexReplace.

Можно проще.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Повтор строк

Первую строку с помощью StringReplace.
Последнюю как?

17

Re: AHK: Повтор строк

Ну если SubStr как в 6 посте религия не позволяет. Просто отрезать последний символ

StringTrimRight, OutputVar, String, 1 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui