سؤال

أنا أكتب تطبيقًا يستخدم قواعد إعادة التسمية لإعادة تسمية قائمة الملفات بناءً على المعلومات المقدمة من قبل المستخدم.قد تكون تسمية الملفات غير متناسقة في البداية، أو قد تكون أسماء الملفات متناسقة.يقوم المستخدم بتحديد قائمة من الملفات، وإدخال معلومات حول الملفات (بالنسبة لملفات 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

يصبح

(?<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() وإضافة كل عنصر من المصفوفة الناتجة إلى معلومات العلامة الخاصة به.

التخمين في أي موضع هو معلومات العلامة التي ستتضمن الكثير من الاستدلالات.

بالمناسبة.عادةً ما تحتوي المجلدات التي تحتوي على ملفات الأغاني على بعض الأنماط في أسمائها أيضًا، على سبيل المثال.

1998 - سبعة

1999 - بيريسكوب

2000 - ثاني أكسيد الكربون

التنسيق هنا هو %Year% - %AlbumName%، مما قد يساعدك في تحديد العنصر الموجود في اسم الملف والذي يمثل الألبوم.

للتوضيح، أنا يفعل لديك نمط لمطابقة أسماء الملفات.

لا أعرف اسم الملف أو النمط مسبقًا، فكل ذلك هو وقت التشغيل.

نمط:

%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

مرة أخرى، التنسيق وأسماء الملفات ليست هي نفسها دائمًا.

لقد كتبت إعادة تسمية ملف سطر الأوامر --- 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top