1

Тема: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Добрый всем вечер!

Нужна помощь, не могу разобраться.

Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2

Лучше день потерять, потом за пять минут долететь!

2 (изменено: serzh82saratov, 2014-10-25 14:00:41)

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Например:


file1 =
(
Добрый всем вечер!

Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
)

file2 =
(
Добрый всем вечер!
Добрый всем вечер!
Добрый всем вечер!

Нужна помощь, не могу разобраться.

Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2
)

Loop, parse, file1, `n   
    file2 := RegExReplace(file2, "m`a)^\n|^\Q" A_LoopField "\E$")
MsgBox % file2
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

3

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Спасибо большое, serzh82saratov!

Все оказалось гораздо проще, чем я пытался сделать ...

Тоже решил это вопрос через RegExReplace(), но немного по-другому. Через создание копии файла и удаления дубликатов строк

RegExReplace(FileListing, "m`a)^(.+)\R(\1(\R|$))+")

Более заморочисто. ... Еще раз большое благодарю!

Лучше день потерять, потом за пять минут долететь!

4 (изменено: DD, 2015-11-02 01:01:45)

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Скрипт весьма хорош, но если обрабатываемые файлы на многие мегабайты (пробовал на восьми), вроде засыпает. Возможен ли вариант для тяжелых файлов?


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

5

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Если заменить рег. выражения на парсинг по образцу ниже, будет лли работа эффективней? —

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%

6

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Можно так попробовать:

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)
+ DD

7

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Почему-то пустое сообщение выводит.

8

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

А файлы 1.txt и 2.txt имеются?

9

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Виноват: сейчас запустил тот же скрипт и он сработал)) Но дождаться обработки двух файлов по 8 мб (по 50 тысяч строк) так и не смог))

10

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Для быстродействия добавьте в начало:

#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 " тысяч строк"
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).
+ DD

11

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

А директиву #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 " тысяч строк"
}

12

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Насколько я понимаю, то теоретически не надо.
Но, так как это стоит недорого, то я бы просто попробовал.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

13

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

А строки вообще перебираются?

Loop, parse, file1, `n   
{ 
	ToolTip % A_LoopField
	Sleep 10
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

14

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Сейчас отчего-то пошла обработка — считаю тыщи))

15 (изменено: Malcev, 2015-11-08 01:46:11)

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Такой еще вариант:

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

16

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Спасибо, попробую. Предыдущий только сейчас завершился — фурычил 50 минут))

17 (изменено: DD, 2015-11-08 05:04:06)

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Работает молниеносно! И строки вывода встречаются только в одном из обрабатываемых файлов)) Но при этом, по-видимому, как и вариант Сержа, делает пропуски: им не находятся строки вывода предыдущим кодом, уникальные в обрабатываемых файлах. Если будет желание посмотреть — http://rghost.ru/7SBSfJCmg.

18

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

им не находятся строки вывода предыдущим кодом, уникальные в обрабатываемых файлах

Не понимаю о чем речь.
Можете привести пример?

19

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Иначе говоря, вот этот хэш B3068503FBD9BFAD46D7C5958410194E80D3906F встречается только в одном из двух обрабатываемых файлов, но в вывод Вашего скрипта не попадает. То же и наоборот — со скриптом, предложенным Сержем.

20 (изменено: DD, 2018-05-08 21:11:06)

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

21

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Скрипт работает согласно задаче:

Нужно считать файл №1 и удалить такие-же (одинаковые) строки из файла №2

Вам нужно конкретизировать задачу.

22

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Извиняюсь, рассеянный я)) Задача действительно немного другая: удалить одинаковые строки из обоих файлов — оставив те, которые не встречаются в другом.

23

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

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

24

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Гранд Респект!

25

Re: AHK: Удаление одинаковых строк из файла №2, содержащихся в файле №1

Оказалось, что для обработки крупных файлов к #MaxMem можно прибавлять значение в мегабайтах, увеличивающих память.