1 (изменено: OmTatSat, 2018-06-24 03:16:41)

Тема: AHK: удалить устаревшие записи разговоров, 6-ую и более запись

На телефоне идёт постоянная запись разговоров, накопилось более 3000 amr файлов. Из-за такого количества программа для прослушивания разговоров медленно работает. Идея - удалить устаревшие разговоры каждого абонента и оставить 6 самых новых.


Файлы имеют такой патерн названий, 5** 27 До 3 Или После 5 Роутер@+380 95 *** *364_20180618182637.amr где до  _  всегда идёт имя и номер абонента.

Рабочий вариант.

FileList =
Loop, Files, %A_WorkingDir%\*.amr, F
FileList = %FileList%%A_LoopFileFullPath%`n
Sort, FileList, r
Loop, Parse, FileList, `n
{
if A_LoopField =
continue
old := subpat1
RegExMatch(A_LoopField, "(.*)_", SubPat)
If InStr(SubPat1, old)
{
same += 1
}
Else
{
same = 0
}
if (same > 5)
{
FileDelete, %A_LoopField%
FileAppend, `n %A_LoopField%, %A_WorkingDir%\deleted.txt
}
}

2 (изменено: OmTatSat, 2018-06-24 03:24:30)

Re: AHK: удалить устаревшие записи разговоров, 6-ую и более запись

Появилась мысль, возможно лучше удалять с списка 6 первых попавшихся файлов с одинаковым текстом до знака @. Таким образом в списке останутся записи только после шестого разговора каждого контакта.

3

Re: AHK: удалить устаревшие записи разговоров, 6-ую и более запись

FileList =
Loop, Files, D:\Downloads_after_15.08.17\фотки\много\record\nomedia\*.amr, F  ; Include Files and Directories
    FileList = %FileList%`t%A_LoopFileName%`n
Sort, FileList, r  ; Sort by date.
;FoundPos := RegExMatch("abcX@YZ123", "(.*)@", SubPat)
;MsgBox, %SubPat1%
MsgBox, %FileList%
Loop, Parse, FileList, `n
{
    if A_LoopField =  ; Omit the last linefeed (blank item) at the end of the list.
        continue
    ;StringSplit, FileItem, A_LoopField, %A_Tab%  ; Split into two parts at the tab char.
old := subpat1
	RegExMatch(A_LoopField, "(.*)_", SubPat)
;MsgBox, %SubPat1% %old%
If InStr(SubPat1, old)
{
	same += 1
 ;MsgBox, %same%
}
Else
{
	same = 0
  ;MsgBox, The string was not found.
}
if (same > 5)
{
	
	FileAppend, `n %A_LoopField%, D:\Downloads_after_15.08.17\фотки\много\record\nomedia\Test.txt
   
}
   ; MsgBox, 4,, %FileList% The next file (modified at %FileItem1%) is:`n%FileItem2%`n`nContinue?
    ;IfMsgBox, No
    ;    break
}

Осталось придумать как удалить.

4

Re: AHK: удалить устаревшие записи разговоров, 6-ую и более запись

Рабочий вариант.

FileList =
Loop, Files, %A_WorkingDir%\*.amr, F
FileList = %FileList%%A_LoopFileFullPath%`n
Sort, FileList, r
Loop, Parse, FileList, `n
{
if A_LoopField =
continue
old := subpat1
RegExMatch(A_LoopField, "(.*)_", SubPat)
If InStr(SubPat1, old)
{
same += 1
}
Else
{
same = 0
}
if (same > 5)
{
FileDelete, %A_LoopField%
FileAppend, `n %A_LoopField%, %A_WorkingDir%\deleted.txt
}
}

На 500мб файлов почистило - хорошо.

5

Re: AHK: удалить устаревшие записи разговоров, 6-ую и более запись


path:=A_ScriptDir
files:=[]
Loop, % path "\*.amr", 0,0
{
	files[A_Index]:=A_LoopFileName
}

for i in files {
	function("new",files[i])
}



Loop, % path "\*.amr", 0,0
{
	if (!function("check",A_LoopFileName)) {
		FileDelete, % A_LoopFileFullPath
	}
}
return


F5::Reload

function(act,value=0,value2=0) {
	static list:=[], max:=5

	if (act="new") {
		num :=RegExReplace(value, ".*@(.*)_.*","$1")
		date:=RegExReplace(value, ".*@.*_(.*)","$1")
		if (!list[num]["total"])
			list[num]:=[],list[num]["total"]:=1, list[num][1]:=date
		else if(list[num]["total"]=max)
			function("add",num,date)
		else list[num]["total"]+=1,i:=list[num]["total"],list[num][i]:=date
	} else if(act="add") {
		num:=value,date:=value2
		for i,value in list[value] {
			if(i="total")
				Continue
			if (IsLatest(date,value)) {
				list[num][i]:=date
				function("add",num,value)
				return 1
			}
		} return 0
	} else if(act="check") {
		num :=RegExReplace(value, ".*@(.*)_.*","$1")
		date:=RegExReplace(value, ".*@.*_(.*)","$1")
		for i,value in list[num] {
			if(list[num][i]=date)
				return 1
		} return 0
	}
}



IsLatest(_1th,_2nd) {
	_1th:=SplitDate(_1th)
	_2nd:=SplitDate(_2nd)
	if(_1th["year"]<_2nd["year"])
		return 0
	else if(_1th["year"]>_2nd["year"])
		return 1

	if(_1th["month"]<_2nd["month"])
		return 0
	else if(_1th["month"]>_2nd["month"])
		return 2

	if(_1th["day"]<_2nd["day"])
		return 0
	else if(_1th["day"]>_2nd["day"])
		return 2
	
	if(_1th["hour"]<_2nd["hour"])
		return 0
	else if(_1th["hour"]>_2nd["hour"])
		return 2
	
	if(_1th["min"]<_2nd["min"])
		return 0
	else if(_1th["min"]>_2nd["min"])
		return 2

	if(_1th["sec"]<_2nd["sec"])
		return 0
	return 6
}



SplitDate(date) {
	var:="",out:=[]
	loop,parse,date
	{
		if(!StrLen(var)&&!A_LoopField)
			Continue
		var.=A_LoopField
		if(A_Index=4)
			out["year"]:=var,var:=""
		else if(A_Index=6)
			out["month"]:=var,var:=""
		else if(A_Index=8)
			out["day"]:=var,var:=""
		else if(A_Index=10)
			out["hour"]:=var,var:=""
		else if(A_Index=12)
			out["min"]:=var,var:=""
		else if(A_Index=14)
			out["sec"]:=var,var:=""
	} return out
	;msgbox % date "`n" out["year"] "-" out["month"] "-" out["day"] "`n" out["hour"] ":" out["min"] ":" out["sec"]
}

6

Re: AHK: удалить устаревшие записи разговоров, 6-ую и более запись

MandarinKa02 попробовал, почему-то не работает. Проверить где начинается сбой в скрипте не могу, так как для меня сложный.