Dateien geschickt filtern oder suchen

Aktuelle Version: 12.10 (06.10.2018)
Alles zum Thema Directory Opus
Antworten
Benutzeravatar
joerg633
Beiträge: 14
Registriert: 1. Sep 2009 16:32
Betriebssystem: Win 7 Ultimate 64Bit
Produkt: DOpus 12.9
Version DOpus: Pro

Dateien geschickt filtern oder suchen

Beitrag von joerg633 » 20. Jun 2018 13:31

Hallöle,
vielleicht hat jemand eine Idee, wie ich das hinbekomme:
In einem Verzeichnis liegen sehr viele Dateien nach folgendem Schema:
aaa_bbb_001.txt
aaa_bbb_002.txt
aaa_bbb_005.txt
aaa_ccc_008.txt
aaa_ccc_009.txt
aaa_ccc_011.txt
aaa_ddd_101.txt
aaa_ddd_111.txt
aaa_ddd_258.txt

Ich möchte nun einen Filter einstellen oder gerne auch Dateisuche durchführen, der mir als Ergebnis das hier liefert:
aaa_bbb_001.txt
aaa_ccc_008.txt
aaa_ddd_101.txt

Das jeweils erste Auftreten in "Untergruppen" von Dateinamen.
Alle Namen beginnen gleich, zwischendrinn gibt es "gleiche" Bereiche (z.B. ccc) und die abschließende Nummerierung muss nicht fortlaufend sein.

Hoffe ich konnte das verständlich formulieren!
Etwas ratlos grüßt
Jörg

Benutzeravatar
tbone
Berater
Beiträge: 483
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Dateien geschickt filtern oder suchen

Beitrag von tbone » 20. Jun 2018 17:58

Bist Du in der Lage den folgenden Buchstabensalat zu deuten und anzuwenden? o)
Das Script bzw. der damit zu erstellende Button, selektiert die von Dir gewünschten Items im aktuellen Pfad.
Basis ist "EasyFilter", ein kleines JS-Gerüst, dass ich mal für solche Fälle entworfen habe, angepasst habe ich nur 4 Zeilen.

Code: Alles auswählen

////////////////////////////////////////////////////////////////////////////////
var PreFilter = function( file ){
	//return true if this file(type) is of interest in the process
	return true;
}
////////////////////////////////////////////////////////////////////////////////
var MainFilter = function( file ){
	//return true to run evaluation on this specific file(type)
	return true;
}
////////////////////////////////////////////////////////////////////////////////
var Evaluate = function( file ){
	//return true to execute the foreach-operation on this file (select, delete etc.)
	var baseBaseName = file.baseName.replace(/(.*?)(_[0-9]{3})$/gi, "$1");
	var fileRef = this.FileExists(baseBaseName.esc()+'.*');
	if (fileRef && fileRef != file)
		return false;
	return true;
}
////////////////////////////////////////////////////////////////////////////////
var ExecuteForEach = function( file ){
	//execute for each file that passed evaluation
	this.cmd.RunCommand('Select "'+file.name+'" EXACT');
} 
////////////////////////////////////////////////////////////////////////////////
var ExecuteForAll = function(){
	//execute finally
	this.cmd.RunCommand('SelectEx MAKEVISIBLE');
} 
////////////////////////////////////////////////////////////////////////////////
function EasyFilter(filesIn,cmd,preFilter,mainFilter,evaluate,executeForEach,executeForAll){
	this.version		= 0.1;
	this.files			= [];
	this.filesFiltered	= [];
	this.filesEvaluated	= [];
	this.cmd			= cmd;
	this.PreFilter		= preFilter;
	this.MainFilter		= mainFilter;
	this.Evaluate		= evaluate;
	this.ExecuteForEach	= executeForEach;
	this.ExecuteForAll	= executeForAll;
	////////////////////////////////////////////////////////////////////////////
	String.prototype.esc = function(str){
		return this.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
	}
	////////////////////////////////////////////////////////////////////////////
	this.FileExists = function( fileNameRegex ){
		fileNameRegex = new RegExp(fileNameRegex);
		for(var i=0;i<this.files.length;i++){
			if (this.files[i].name.search(fileNameRegex)!=-1)
				return this.files[i];
		}
		return null;
	}
	////////////////////////////////////////////////////////////////////////////
	DOpus.Output("PreFiltering ["+filesIn.length+"] files..");
	for(var i=0;i<filesIn.length;i++){
		if (this.PreFilter(filesIn[i])===true){
			this.files[this.files.length] = filesIn[i];
			DOpus.Output("    PreFilter passed ["+filesIn[i].name+"]");
		} else {
			//DOpus.Output("    PreFilter ignore ["+filesIn[i].name+"]");
		}
	}
	DOpus.Output("");
	////////////////////////////////////////////////////////////////////////////
	DOpus.Output("MainFiltering ["+this.files.length+"] files..");
	for(var i=0;i<this.files.length;i++){
		if (this.MainFilter(this.files[i])===true){
			DOpus.Output("    MainFilter passed ["+this.files[i].name+"]");
			this.filesFiltered[this.filesFiltered.length] = this.files[i];
		} else {
			//DOpus.Output("    MainFilter ignore ["+filesIn[i].name+"]");
		}
	}
	DOpus.Output("");
	////////////////////////////////////////////////////////////////////////////
	DOpus.Output("Evaluating ["+this.filesFiltered.length+"] files..");
	for(var i=0;i<this.filesFiltered.length;i++){
		if (this.Evaluate(this.filesFiltered[i])===true){
			DOpus.Output("    Evaluation passed ["+this.filesFiltered[i].name+"]");
			this.filesEvaluated[this.filesEvaluated.length] = this.filesFiltered[i];
		} else {
			//DOpus.Output("    Evaluation ignore ["+this.filesFiltered[i].name+"]");
		}
	}
	DOpus.Output("");
	////////////////////////////////////////////////////////////////////////////
	DOpus.Output("Processing ["+this.filesEvaluated.length+"] files..");
	for(var i=0;i<this.filesEvaluated.length;i++){
		DOpus.Output("    Running ForEachOp ["+this.filesEvaluated[i].name+"]");
		this.ExecuteForEach(this.filesEvaluated[i]);
	}
	DOpus.Output("");
	////////////////////////////////////////////////////////////////////////////
	DOpus.Output("Running ForAll-Operation..");
	this.ExecuteForAll();
	DOpus.Output("");
}
////////////////////////////////////////////////////////////////////////////////
function OnClick(data){
	var filesTab = data.func.sourcetab.files, files = [];
	var cmd = data.func.command; cmd.ClearFiles();
	////////////////////////////////////////////////////////////////////////////
	for(var i=0;i<filesTab.count;i++){
		var file = {	name		: String(filesTab(i).name).toLowerCase(),
						baseName	: String(filesTab(i).name_stem).toLowerCase(),
						ext			: String(filesTab(i).ext).toLowerCase() };
		files[files.length] = file;
	}
	var filter = new EasyFilter(files,cmd,PreFilter,MainFilter,Evaluate,ExecuteForEach,ExecuteForAll);
	DOpus.Output("Done.");
}

Benutzeravatar
joerg633
Beiträge: 14
Registriert: 1. Sep 2009 16:32
Betriebssystem: Win 7 Ultimate 64Bit
Produkt: DOpus 12.9
Version DOpus: Pro

Re: Dateien geschickt filtern oder suchen

Beitrag von joerg633 » 21. Jun 2018 08:10

Wow!
Vielen Dank für die superschnelle Info.
Hatte mich gestern schon mal mit regulären Ausdrücken "kurz" beschäftigt und war genauso schnell "vorerst" gescheitert.
Ich schaue mir das am WoE an...
:D

Benutzeravatar
joerg633
Beiträge: 14
Registriert: 1. Sep 2009 16:32
Betriebssystem: Win 7 Ultimate 64Bit
Produkt: DOpus 12.9
Version DOpus: Pro

Re: Dateien geschickt filtern oder suchen

Beitrag von joerg633 » 21. Jun 2018 12:42

Das lässt mir natürlich keine Ruhe...
:lol:
Funktioniert soweit sehr gut.
Ich habe nun erkannt, dass bei Spezialitäten noch falsch "evaluiert" wird!
Z.B. führende 0 oder Leerzeichen in der Nummerierung usw.
Dazu muss ich mich dann "wie befürchtet" mit den regulären Ausdrücken auseinandersetzen...
:roll:
Wird halt mal Zeit...
Ergibt dann halt einen massiven Lerneffekt!
:wink:

Bereits erledigt!
Passt!
Super, besten Dank!

Antworten