Тема: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1
Добрый всем вечер!
Нужна помощь, не могу разобраться.
Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → AutoHotkey → AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый всем вечер!
Нужна помощь, не могу разобраться.
Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
Например:
file1 =
(
Добрый всем вечер!
Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
)
file2 =
(
Добрый всем вечер!
Добрый всем вечер!
Добрый всем вечер!
Нужна помощь, не могу разобраться.
Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
)
Loop, parse, file1, `n
file2 := RegExReplace(file2, "m`a)^\n|^\Q" A_LoopField "\E$")
MsgBox % file2
Спасибо большое, serzh82saratov!
Все оказалось гораздо проще, чем я пытался сделать ...
Тоже решил это вопрос через RegExReplace(), но немного по-другому. Через создание копии файла и удаления дубликатов строк
RegExReplace(FileListing, "m`a)^(.+)\R(\1(\R|$))+")
Более заморочисто. ... Еще раз большое благодарю!
Скрипт весьма хорош, но если обрабатываемые файлы на многие мегабайты (пробовал на восьми), вроде засыпает. Возможен ли вариант для тяжелых файлов?
file1 = %A_ScriptDir%\file1.csv
FileRead, file1, %file1%
file2 = %A_ScriptDir%\file2.csv
FileRead, file2, %file2%
Loop, parse, file1, `n
file2 := RegExReplace(file2, "m`a)^\n|^\Q" A_LoopField "\E$")
;MsgBox % file2
FileAppend, % file2, %A_ScriptDir%\Res.CSV
Если заменить рег. выражения на парсинг по образцу ниже, будет лли работа эффективней? —
list1 =
( join`n
smss.exe
csrss.exe
winlogon.exe
services.exe
lsass.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
)
List2 =
( join`n
smss.exe
csrss.exe
winlogon.exe
services.exe
lsass.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
ggh
apture.exe
)
List2 = `n%List2%`n
Loop, Parse, list1, `n, `r
StringReplace, List2, List2, `n%A_LoopField%`n, `n, all
Loop, Parse, List2, `n, `r
If A_LoopField
msgbox, %A_LoopField%
Можно так попробовать:
SetBatchLines, -1
FileRead, file1, 1.txt
Loop, read, 2.txt
{
If !RegExMatch(file1, "(^|\R)\Q" A_LoopReadLine "\E(\R|$)")
file2 .= A_LoopReadLine "`n"
}
msgbox % SubStr(file2, 1, StrLen(file2)-1)
Почему-то пустое сообщение выводит.
А файлы 1.txt и 2.txt имеются?
Виноват: сейчас запустил тот же скрипт и он сработал)) Но дождаться обработки двух файлов по 8 мб (по 50 тысяч строк) так и не смог))
Для быстродействия добавьте в начало:
#NoEnv
ListLines Off
SetBatchLines -1
ну и какую то отладку произведите, зависает скрипт, или действительно выполнение занимает неадекватное время.
Loop, parse, file1, `n
{
file2 := RegExReplace(file2, "m`a)^\n|^\Q" A_LoopField "\E$")
if !Mod(A_Index, 1000)
ToolTip % "обработано " A_Index // 1000 " тысяч строк"
}
А директиву #MaxMem стоит добавлять? Подсказка периодически выводила "0" —
#NoEnv
ListLines Off
SetBatchLines -1
FileRead, file1, 1.txt
FileRead, file2, 2.txt
Loop, parse, file1, `n
{
file2 := RegExReplace(file2, "m`a)^\n|^\Q" A_LoopField "\E$")
if !Mod(A_Index, 100)
ToolTip % "обработано " A_Index // 1000 " тысяч строк"
}
Насколько я понимаю, то теоретически не надо.
Но, так как это стоит недорого, то я бы просто попробовал.
А строки вообще перебираются?
Loop, parse, file1, `n
{
ToolTip % A_LoopField
Sleep 10
}
Сейчас отчего-то пошла обработка — считаю тыщи))
Такой еще вариант:
SetBatchLines -1
FileRead, file1, 1.txt
FileRead, file2, 2.txt
obj := []
loop, parse, file2, `n, `r
obj[A_LoopField] := 1
loop, parse, file1, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
MsgBox % res
Спасибо, попробую. Предыдущий только сейчас завершился — фурычил 50 минут))
Работает молниеносно! И строки вывода встречаются только в одном из обрабатываемых файлов)) Но при этом, по-видимому, как и вариант Сержа, делает пропуски: им не находятся строки вывода предыдущим кодом, уникальные в обрабатываемых файлах. Если будет желание посмотреть — http://rghost.ru/7SBSfJCmg.
им не находятся строки вывода предыдущим кодом, уникальные в обрабатываемых файлах
Не понимаю о чем речь.
Можете привести пример?
Иначе говоря, вот этот хэш B3068503FBD9BFAD46D7C5958410194E80D3906F встречается только в одном из двух обрабатываемых файлов, но в вывод Вашего скрипта не попадает. То же и наоборот — со скриптом, предложенным Сержем.
Скрипт работает согласно задаче:
Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
Вам нужно конкретизировать задачу.
Извиняюсь, рассеянный я)) Задача действительно немного другая: удалить одинаковые строки из обоих файлов — оставив те, которые не встречаются в другом.
SetBatchLines -1
FileRead, file1, 1.txt
FileRead, file2, 2.txt
loop 2
{
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
}
MsgBox % res
Гранд Респект!
Оказалось, что для обработки крупных файлов к #MaxMem можно прибавлять значение в мегабайтах, увеличивающих память.
Как можно было бы изменить последний код из поста №23, чтобы уникальные строки каждого файла не объединялись в новый, а перезаписывались в обрабатываемые файлы, либо переносились в новые файлы — под теми же именами — в другое место?
SetBatchLines -1
FileRead, file1, 1.txt
FileRead, file2, 2.txt
loop 2
{
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
}
MsgBox % res
Нужно почитать про тернарные операторы и изменить эту строчку:
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
Понял, что там условие. Но как развести разницу в два файла, а не объединять её?
После "loop 2" вставьте res := "".
Тоже не выходит. Мне надо развести разницу в два файла по такому типу —
SetBatchLines -1
FileRead, file1, 1.txt
FileRead, file2, 2.txt
loop 2
{
res := ""
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
}
fileappend % obj, %a_desktop%/1.txt
fileappend % res, %a_desktop%/2.txt
Пример приведите файлов и результат.
Вот пример —
SetBatchLines -1
file1 =
(
SetWorkingDir, %A_ScriptDir%
If !ErrorLevel MsgBox
Tooltip,Sleep,900
)
file2 =
(
If !ErrorLevel MsgBox
Tooltip,Sleep,900
Tooltip
)
loop 2
{
res := ""
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
}
msgbox % file1
msgbox % file2
Надо бы, чтоб вышло два вывода, с уникальным содержимым для file1 и file2. Для file1 — это строка "SetWorkingDir, %A_ScriptDir%", а для file2 — строка "Tooltip".
А в чём сложность?
SetBatchLines -1
file1 =
(
SetWorkingDir, %A_ScriptDir%
If !ErrorLevel MsgBox
Tooltip,Sleep,900
)
file2 =
(
If !ErrorLevel MsgBox
Tooltip,Sleep,900
Tooltip
)
loop 2
{
res := ""
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
msgbox % res
}
Сложность в том, что так весь результат опять идёт в один файл, а мне надо в два.
В коде результат идет не в файл, а в переменную res.
Идёт 2 цикла, в начале каждого цикла переменная res обнуляется.
SetBatchLines -1
file1 =
(
SetWorkingDir, %A_ScriptDir%
If !ErrorLevel MsgBox
Tooltip,Sleep,900
)
file2 =
(
If !ErrorLevel MsgBox
Tooltip,Sleep,900
Tooltip
)
loop 2
{
res := ""
If A_Index = 1
a := file1, b := file2
Else
a := file2, b := file1
obj := []
loop, parse, a, `n, `r
obj[A_LoopField] := 1
loop, parse, b, `n, `r
res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""
out%A_Index% := res
}
msgbox % out1
msgbox % out2
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться