Frage

Ich schreibe eine Anwendung, die Regeln verwenden Umbenennen eine Liste von Dateien, die vom Benutzer auf der Basis von Informationen zu benennen. Die Dateien werden inkonsistent beginnen benannt, oder die Dateinamen können konsistent sein. Der Benutzer wählt eine Liste von Dateien und gibt Informationen über die Dateien (für MP3s, würden sie Künstler, Titel, Album, etc. sein). Mit Hilfe eines Umbenennungsregel (Beispiel unten), verwendet das Programm den Benutzer eingegebenen Informationen, die Dateien entsprechend umbenannt werden.

Wenn jedoch alle oder einige der Dateien konsequent benannt sind, würde Ich mag, damit das Programm die Dateiinformationen zu ‚erraten‘. Das ist das Problem, das ich habe. Was ist der beste Weg, dies zu tun?

Beispiel Dateinamen:

Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3

Umbenennen Regel:

%Artist%-%Album%-%Track%-%Title%.mp3

Das Programm soll den Künstler, Titelnummer, Titel und Albumnamen richtig geschlossen werden.

Auch was ist der beste Weg, dies zu tun? Ich dachte, reguläre Ausdrücke, aber ich bin ein wenig verwirrt.

War es hilfreich?

Lösung

Am einfachsten wäre jedes %Label% mit (?<Label>.*?) zu ersetzen, und die Flucht alle anderen Zeichen.

%Artist%-%Album%-%Track%-%Title%.mp3

wird

(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3

Sie würden dann jede Komponente in benannte Capture-Gruppen erhalten.

Dictinary<string,string> match_filename(string rule, string filename) {
    Regex tag_re = new Regex(@'%(\w+)%');
    string pattern = tag_re.Replace(Regex.escape(rule), @'(?<$1>.*?)');
    Regex filename_re = new Regex(pattern);
    Match match = filename_re.Match(filename);

    Dictionary<string,string> tokens =
            new Dictionary<string,string>();
    for (int counter = 1; counter < match.Groups.Count; counter++)
    {
        string group_name = filename_re.GroupNameFromNumber(counter);
        tokens.Add(group_name, m.Groups[counter].Value);
    }
    return tokens;
}

Aber wenn der Benutzer verlässt die Trennzeichen aus, oder wenn die Begrenzungszeichen in den Bereichen enthalten sein könnten, könnten Sie einige seltsame Ergebnisse. Das Muster würde für %Artist%%Album% würde (?<Artist>.*?)(?<Album>.*?), die sich auf .*?.*? entspricht. Das Muster würde nicht wissen, wo zu spalten.

Dies könnte gelöst werden, wenn Sie das Format bestimmter Felder, wie die Spur-Nummer kennen. Wenn Sie %Track% übersetzen stattdessen (?<Track>\d+), würde wissen, das Muster, dass alle Ziffern im Dateinamen muss die Track sein.

Andere Tipps

Nicht die Antwort auf die Frage, die Sie gefragt, sondern ein ID3-Tag Bibliothek zu lesen sein könnte ein besserer Weg, dies zu tun, wenn Sie MP3-Dateien verwenden. Eine schnelle Google kam mit:. C # ID3-Bibliothek

Wie, für die Zeichenfolge Positionen halten den Künstler, das Album zu erraten, und Songtitel ... das erste, was ich denken kann, ist, dass, wenn Sie eine gute Auswahl haben, mit zu arbeiten, sagen mehrere Alben, könnte man zuerst sehen, welche Position wiederholt die meisten, die der Künstler sein würde, der die zweitmeisten (Album) wiederholt und die am wenigsten (Songtitel) wiederholt.

Ansonsten scheint es wie eine schwierige Vermutung nur auf ein paar Strings in dem Dateinamen basiert machen ... könnten Sie den Benutzer auch Eingang einen passender Ausdruck für die Dateinamen stellen, die die Reihenfolge der Felder beschreiben

Die Dateinamen in Ihrem Beispiel scheinen mir ziemlich konsistent. Sie können einfach String.split tun () und jedes Element des resultierenden Arrays auf dessen nach Tag-Informationen hinzuzufügen.

Erraten, an welcher Stelle ist die Tag-Informationen TONNEN Heuristiken beinhalten würde.

Btw. Ordner, die Song-Dateien haben in der Regel einige Muster in ihrem Namen als auch, f.e.

enthalten

1998 - Sieben

1999 - Periscope

2000 - CO2

Das Format ist hier% Jahr% -.% Albumname%, das könnten Ihnen helfen, in den Dateinamen zu identifizieren, welches Element ist das Album

Um zu klären, I ein Muster für die Dateinamen übereinstimmen gegen.

Ich weiß nicht, die Dateinamen oder Muster vor der Zeit, es ist alles in Laufzeit.

Muster:

%Artist%-%Album%-%Track%-%Title%.mp3

Dateiname:

Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3

Erwartetes Ergebnis:

Artist    Album          Track Title
Kraftwerk Kraftwerk      01    RuckZuck
Kraftwerk Autobahn       01    Autobahn
Kraftwerk Computer World 01    Numbers

Auch das Format und Dateinamen sind nicht immer gleich.

Ich habe eine Kommandozeilen-File Renamer geschrieben --- RenameWand ---, die die Art tut von Musterabgleich Sie beschreiben. Es ist in Java zwar, aber ich denke, einen Teil des Quellcodes und die Verwendung Dokumentation für Sie von Interesse sein kann. Ein einfaches Beispiel dafür, was das Programm tun können:

Quell-Pattern (vom Benutzer angegeben):

<artist>-<album>-<track>-<title>.mp3

Zielmuster (vom Benutzer angegeben):

<title.upper>-<3|track+10>-<album.lower>-<artist>.mp3

Original Dateiname:

Kraftwerk-Computer World-03-Numbers.mp3

Umbenannt Dateiname:

NUMBERS-013-computer world-Kraftwerk.mp3
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top