문제

이름 바꾸기 규칙을 사용하여 사용자가 제공 한 정보를 기반으로 파일 목록의 이름을 바꾸는 응용 프로그램을 작성합니다. 파일의 시작은 일관되지 않은 이름을 지정하거나 파일 이름이 일관 될 수 있습니다. 사용자는 파일 목록을 선택하고 파일에 대한 정보를 입력합니다 (MP3의 경우 아티스트, 제목, 앨범 등). 이름 바꾸기 규칙 (아래의 예)를 사용 하여이 프로그램은 사용자 입력 된 정보를 사용하여 파일의 이름을 바꿉니다.

그러나 파일의 모든 또는 일부 또는 일부가 일관되게 명명 된 경우 프로그램이 파일 정보를 '추측'하도록 허용하고 싶습니다. 그것이 제가 가진 문제입니다. 이것을하는 가장 좋은 방법은 무엇입니까?

샘플 파일 이름 :

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

규칙 이름 바꾸기 :

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

이 프로그램은 아티스트, 트랙 번호, 제목 및 앨범 이름을 올바르게 추론해야합니다.

다시, 이것을하는 가장 좋은 방법은 무엇입니까? 나는 정규 표현을 생각하고 있었지만 약간 혼란스러워합니다.

도움이 되었습니까?

해결책

가장 쉬운 것은 각각을 교체하는 것입니다 %Label% ~와 함께 (?<Label>.*?), 다른 캐릭터를 피하십시오.

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

becomes

(?<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.

다른 팁

질문에 대한 답이 아니라 ID3 태그 MP3를 사용할 때 라이브러리를 읽는 것이 더 좋은 방법 일 수 있습니다. 빠른 Google이 다음과 같습니다. C# ID3 라이브러리.

아티스트, 앨범 및 노래 제목을 보유하는 문자열 위치를 추측하는 데있어서 ... 내가 생각할 수있는 첫 번째 것은 여러 앨범으로 작업하기에 좋은 선택이 있다면 먼저 어떤 위치가 가장 많이 반복되는지 확인할 수 있다는 것입니다. , 이것은 아티스트가 될 것이며, 이는 두 번째 (앨범)를 반복하고 가장 작은 (노래 제목)를 반복합니다.

그렇지 않으면 파일 이름의 몇 가지 문자열만을 기반으로하는 것은 어려운 추측처럼 보입니다. 사용자에게 필드의 순서를 설명하는 파일 이름에 대해 일치하는 표현식을 입력하도록 요청할 수 있습니까?

당신의 예제의 파일 이름은 나에게 꽤 일관된 것 같습니다. string.split ()를 단순히 수행하고 결과 배열의 각 요소를 해당 태그 정보에 추가 할 수 있습니다.

어떤 위치에 어떤 태그 정보가 수많은 휴리스틱을 포함하는지 추측합니다.

BTW. 노래 파일이 포함 된 폴더는 일반적으로 이름에 약간의 패턴이 있습니다.

1998-7

1999 -Periscope

2000 -CO2

여기의 형식은 %연도 % - %앨범 이름 %이며, 이는 파일 이름의 앨범인지 식별하는 데 도움이 될 수 있습니다.

명확히하기 위해, i ~하다 파일 이름과 일치하는 패턴이 있습니다.

나는 파일 이름이나 패턴을 미리 모른다. 그것은 모두 런타임이다.

무늬:

%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

다시, 형식과 파일 이름이 항상 동일하지는 않습니다.

나는 명령 줄 파일 렌즈 라머를 작성했습니다 --- 르네마 랜드 --- 그것은 당신이 묘사하는 패턴의 종류를합니다. 그래도 Java에 있지만 소스 코드와 사용법 문서 중 일부가 귀하에게 관심이있을 수 있다고 생각합니다. 프로그램이 할 수있는 일의 간단한 예 :

소스 패턴 (사용자 지정) :

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

대상 패턴 (사용자 지정) :

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

원본 파일 이름 :

Kraftwerk-Computer World-03-Numbers.mp3

이름 변경 Filename :

NUMBERS-013-computer world-Kraftwerk.mp3
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top