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.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui
+ 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.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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 можно прибавлять значение в мегабайтах, увеличивающих память.

26 (изменено: DD, 2018-05-07 09:04:51)

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

Как можно было бы изменить последний код из поста №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

27

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

Нужно почитать про тернарные операторы и изменить эту строчку:

res .= !obj[A_LoopField] ? (res?"`n":"") A_LoopField : ""

28

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

Понял, что там условие. Но как развести разницу в два файла, а не объединять её?

29

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

После "loop 2" вставьте res := "".

30

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

Тоже не выходит. Мне надо развести разницу в два файла по такому типу —

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

31

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

Пример приведите файлов и результат.

32 (изменено: DD, 2018-05-08 21:07:58)

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

Вот пример —


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".

33

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

А в чём сложность?

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
}

34

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

Сложность в том, что так весь результат опять идёт в один файл, а мне надо в два.

35

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

В коде результат идет не в файл, а в переменную 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
+ DD