Сопоставление с образцом и значения заполнителя

Я пишу приложение, которое использует правила переименования переименовать список файлов на основе информации, данной пользователем. Файлы можно несовместимо назвать для начала, или имена файлов могут быть последовательными. Пользователь выбирает список файлов и вводит информацию о файлах (для MP3s, они были бы Художником, Заголовком, Альбомом, и т.д.). Используя переименовать правило (пример ниже), программа использует введенную пользователями информацию для переименования файлов соответственно.

Однако, если бы все или некоторые, которыми файлы последовательно называют, я хотел бы позволить программе 'предполагать' информацию о файле. Это - проблема, которую я имею. Что лучший способ состоит в том, чтобы сделать это?

Демонстрационные имена файлов:

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

Переименуйте правило:

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

Программа должна правильно вывести Художника, Номер дорожки, Заголовок и Название альбома.

Снова, что лучший способ состоит в том, чтобы сделать это? Я думал регулярные выражения, но я немного смущен.

7
задан Wiktor Stribiżew 8 October 2019 в 23:38
поделиться

5 ответов

Самый легкий должен был бы заменить каждого %Label% с (?<Label>.*?), и выйдите из любых других символов.

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

становится

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

Вы затем получили бы каждый компонент в именованные группы получения.

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

Но если пользователь не учитывает разделители, или если разделители могли бы содержаться в полях, Вы могли бы получить некоторые странные результаты. Шаблон был бы для %Artist%%Album% стал бы (?<Artist>.*?)(?<Album>.*?) который эквивалентен .*?.*?. Шаблон не знал бы, где разделить.

Это могло быть решено, если Вы знаете формат определенных полей, таких как номер дорожки. Если Вы переводите %Track% кому: (?<Track>\d+) вместо этого, шаблон знал бы, что любые цифры в имени файла должны быть Track.

3
ответ дан 7 December 2019 в 14:39
поделиться

Не ответ на вопрос Вы спросили, но библиотека чтения тега ID3 могла бы быть лучшим способом сделать это при использовании MP3s. Быстрый Google придумал: Библиотека C# ID3.

Что касается предположения, которые представляют положения в виде строки, содержат художника, альбом и заголовок песни..., первая вещь, о которой я могу думать, состоит в том, что, если у Вас есть хороший выбор для работы со скажем несколько альбомов, Вы могли бы увидеть в первый раз, какое положение повторяется больше всего, который был бы художником, который повторяет вторые самые большие (альбом) и который повторяет наименьшее количество (заголовок песни).

Иначе на трудное предположение походит делать базирующимся только на нескольких строках в имени файла... Вы могли попросить, чтобы пользователь также ввел выражение соответствия для имени файла, которое описывает порядок полей?

1
ответ дан 7 December 2019 в 14:39
поделиться

Имена файлов в Вашем примере кажутся довольно последовательными мне. Можно просто сделать строку. Разделение () и добавляет каждый элемент полученного массива к согласно данным меток.

Предположение, которое - положение, какие данные меток включили бы ТОННЫ эвристики.

Папки Btw., которые содержат файлы песни обычно, имеют некоторый шаблон на свое имя также, f.e.

1998 - Семь

1999 - Перископ

2000 - CO2

Формат здесь является %Year % - %AlbumName %, который мог бы помочь Вам определить, какой элемент в имени файла является альбомом.

0
ответ дан 7 December 2019 в 14:39
поделиться

Для разъяснения у меня ДЕЙСТВИТЕЛЬНО есть шаблон для соответствия именам файлов против.

Я не знаю имени файла или шаблона заранее, это - все время выполнения.

Шаблон:

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

Имена файлов:

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

Ожидаемый результат:

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

Снова, формат и имена файлов являются не всегда тем же.

0
ответ дан 7 December 2019 в 14:39
поделиться

Я записал файл renamer---RenameWand---командной строки, который делает вид сопоставления с образцом, которое Вы описываете. Это находится в Java, хотя, но я думаю, часть исходного кода и документации использования может представлять интерес для Вас. Простой пример того, что может сделать программа:

Исходный шаблон (указан пользователями):

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

Целевой шаблон (указан пользователями):

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

Исходное имя файла:

Kraftwerk-Computer World-03-Numbers.mp3

Переименованное имя файла:

NUMBERS-013-computer world-Kraftwerk.mp3
0
ответ дан 7 December 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: