Question

J'écris une application qui utilise les règles de renommage pour renommer une liste de fichiers en fonction des informations fournies par l'utilisateur. Les noms de fichiers peuvent être nommés de manière incohérente, ou les noms de fichiers peuvent être cohérents. L'utilisateur sélectionne une liste de fichiers et entre des informations sur les fichiers (pour les MP3, il s'agira de l'artiste, du titre, de l'album, etc.). À l'aide d'une règle de renommage (exemple ci-dessous), le programme utilise les informations saisies par l'utilisateur pour renommer les fichiers en conséquence.

Cependant, si tous les fichiers ou certains d’entre eux sont nommés de la même manière, j’autorise le programme à "deviner" les informations relatives au fichier. C'est le problème que j'ai. Quelle est la meilleure façon de faire cela?

Exemples de noms de fichiers:

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

Renommer la règle:

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

Le programme doit déduire correctement l'artiste, le numéro de la piste, le titre et le nom de l'album.

Encore une fois, quel est le meilleur moyen de le faire? Je pensais à des expressions régulières, mais je suis un peu confus.

Était-ce utile?

La solution

Le plus simple serait de remplacer chaque %Label% par (?<Label>.*?) et d'échapper à tout autre caractère.

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

devient

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

Vous obtiendrez ensuite chaque composant dans des groupes de capture nommés.

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;
}

Toutefois, si l'utilisateur omet les délimiteurs ou si ceux-ci peuvent être contenus dans les champs, vous risquez d'obtenir des résultats étranges. Le modèle deviendrait pour %Artist%%Album% deviendrait (?<Artist>.*?)(?<Album>.*?) ce qui équivaut à .*?.*?. Le motif ne saurait pas où se scinder.

Ceci pourrait être résolu si vous connaissez le format de certains champs, tels que le numéro de piste. Si vous traduisez %Track% en (?<Track>\d+), le modèle saura que tous les chiffres du nom de fichier doivent être les Track.

Autres conseils

Ce n'est pas la réponse à la question que vous avez posée, mais une bibliothèque de lecture ID3 peut être une meilleure façon de le faire lorsque vous utilisez des fichiers MP3. Un rapide Google a proposé la bibliothèque C # ID3 .

En ce qui concerne le choix de la position des cordes sur l’artiste, l’album et le titre de la chanson, la première chose à laquelle je peux penser est que, si vous avez une bonne sélection, par exemple plusieurs albums, vous pouvez d'abord voir quelle position répète le plus, qui serait l'artiste, qui répètera le plus souvent (album) et qui répètera le moins (titre de la chanson).

Sinon, il semble difficile de faire une supposition en se basant uniquement sur quelques chaînes du nom de fichier ... pouvez-vous demander à l'utilisateur de saisir également une expression correspondante pour le nom de fichier qui décrit l'ordre des champs? / p>

Les noms de fichiers de votre exemple me semblent assez cohérents. Vous pouvez simplement faire string.Split () et ajouter chaque élément du tableau résultant à ses informations de balises correspondantes.

Déterminer à quelle position se trouve quelle information de balise impliquerait des TONNES d’heuristique.

Btw. les dossiers contenant des fichiers de morceau ont généralement un motif dans leur nom, par exemple.

1998 - Sept

1999 - Périscope

2000 - CO2

Le format ici est% Year% -% AlbumName%, ce qui peut vous aider à identifier quel élément du nom de fichier correspond à l'album.

Pour clarifier, je DOIS avoir un motif pour faire correspondre les noms de fichiers.

Je ne connais pas le nom de fichier ni le modèle à l'avance, c'est tout pour l'exécution.

Modèle:

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

Noms de fichiers:

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

Résultat attendu:

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

Encore une fois, le format et les noms de fichiers ne sont pas toujours les mêmes.

J'ai écrit un fichier renamer de ligne de commande --- RenameWand --- qui fait le genre de correspondance de modèle que vous décrivez. C'est en Java cependant, mais je pense qu'une partie du code source et de la documentation d'utilisation pourrait vous intéresser. Un exemple simple de ce que le programme peut faire:

Modèle source (spécifié par l'utilisateur):

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

Modèle cible (spécifié par l'utilisateur):

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

Nom du fichier d'origine:

Kraftwerk-Computer World-03-Numbers.mp3

Nom de fichier renommé:

NUMBERS-013-computer world-Kraftwerk.mp3
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top