Тема: AHK: Повтор строк
Как сделать такой скрипт, который будет убирать повторяющиеся строки из файла?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как сделать такой скрипт, который будет убирать повторяющиеся строки из файла?
Читаем файл построчно. Записываем содержимое текущей строки в переменную. Читаем следующу строку; если её содержимое совпадает со значением любой из переменных, то переходим к следующей строке; иначе записываем её содержимое во вторую переменную. И так далее. Когда файл закончится, последовательно считать все переменные и записать их содержимое в файл.
А можно проще.
FileRead, Text, Source.txt
Sort, Text, U
FileAppend, %Text%, Target.txtMalcev
Так не лучше:
Text =
(
строка 2
строка 1
строка 1
строка 2
строка 1
)
Sort, Text, U
MsgBox % Text
Надо (по идее):
строка 2
строка 1А получается:
строка 1
строка 2Но в частных случаях может подойти.
Да, я вот тоже вспомнил про Sort и подумал, что неплохо бы там иметь опцию чисто удаления повторов, без сортировки.
если её содержимое совпадает со значением любой из переменных
Я бы сделал без (псевдо) массивов:
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)
serzh82saratov, вот любите вы все усложнять - получаем меньшее количество строк, а код очень тяжело для новичка читаем.
Text =
(
строка 2
строка 1
строка 1
строка 2
строка 1
)
Loop, Parse, Text, `n
{
If NewText not contains %A_LoopField%`n
NewText .= A_LoopField . "`n"
}
msgbox % NewTextвот любите вы все усложнять
Если новичку интересно, то мне не трудно объяснить. пруф.
----------
В вашем нерабочем:
Text =
(
А где же следующая строка? строка 2
строка 2
строка 1
строка 1
строка 1
)
Loop, Parse, Text, `n
{
If NewText not contains %A_LoopField%`n
NewText .= A_LoopField . "`n"
}
msgbox % NewText
варианте надо ещё удалять последний перевод строки, которого нет в оригинале.
код очень тяжело для новичка читаем.
Ну тогда выражения:
NewText .= A_LoopField . "`n"это зло:
NewText = %NewText%%A_LoopField%`n Вот исправленный вариант.
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)Наверное так:
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)
Нет. Долблю свой.
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")А если нужен учёт пустых строк в начале и конце?
Text =
(
строка 2
строка 2
строка 1
строка 1
строка 1
)
Наверное как-то с помощью RegexReplace.
Наверное как-то с помощью RegexReplace.
Можно проще.
Первую строку с помощью StringReplace.
Последнюю как?
Ну если SubStr как в 6 посте религия не позволяет. Просто отрезать последний символ
StringTrimRight, OutputVar, String, 1 Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться