Pregunta

Estoy escribiendo una aplicación que utiliza el cambio de nombre de las reglas para cambiar el nombre de una lista de archivos basados en la información dada por el usuario.Los archivos pueden ser de forma incompatible con nombre, o los nombres de archivo pueden ser compatibles.El usuario selecciona de una lista de archivos y entradas de información acerca de los archivos (Mp3, que sería Artista, Título, Álbum, etc).El uso de un cambio de nombre de la regla (ejemplo abajo), el programa utiliza el usuario de la información introducida para cambiar el nombre de los archivos en consecuencia.

Sin embargo, si todos o algunos de los archivos se nombran constantemente, me gustaría para permitir que el programa para 'adivinar' el archivo de la información.Ese es el problema que estoy teniendo.¿Cuál es la mejor manera de hacer esto?

Muestra los nombres de archivo:

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

Cambiar El Nombre De La Regla:

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

El programa debe deducir correctamente el Artista, número de Pista, Título, y de nombre de Álbum.

De nuevo, ¿cuál es la mejor manera de hacer esto?Yo estaba pensando en expresiones regulares, pero estoy un poco confundida.

¿Fue útil?

Solución

Más fácil sería sustituir cada %Label% con (?<Label>.*?), y escapar de cualquier otro carácter.

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

se convierte en

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

Entonces usted podría obtener de cada componente en nombre de captura de los grupos.

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

Pero si el usuario deja el delimitadores, o si los delimitadores podría ser contenida dentro de los campos, se podría conseguir algunos resultados extraños.El patrón de %Artist%%Album% sería (?<Artist>.*?)(?<Album>.*?) que es equivalente a .*?.*?.El patrón no sabría dónde dividir.

Esto se podría solucionar si sabe el formato de determinados campos, tales como la pista número.Si usted traducir %Track% a (?<Track>\d+) en cambio, el patrón de saber que los dígitos en el nombre del archivo debe ser el Track.

Otros consejos

No es la respuesta a la pregunta que hizo, pero una etiqueta ID3 puede ser una biblioteca de lectura Una mejor manera de hacerlo cuando usa MP3. A Google se le ocurrió rápidamente: Biblioteca C # ID3 .

En cuanto a adivinar qué posiciones de cadena contienen el artista, el álbum y el título de la canción ... lo primero que puedo pensar es que si tienes una buena selección con la que trabajar, digamos varios álbumes, primero puedes ver qué posición repite más, cuál sería el artista, cuál repite más (álbum) y cuál repite menos (título de la canción).

De lo contrario, parece una suposición difícil de hacer basándose únicamente en unas pocas cadenas en el nombre del archivo ... ¿podría pedirle al usuario que también ingrese una expresión coincidente para el nombre del archivo que describa el orden de los campos?

Los nombres de archivo en su ejemplo me parecen bastante consistentes. Simplemente puede hacer string.Split () y agregar cada elemento de la matriz resultante a su información de etiqueta correspondiente.

Adivinar en qué posición es qué información de etiqueta implicaría TONELADAS de heurística.

Por cierto. las carpetas que contienen archivos de canciones generalmente también tienen algún patrón en su nombre, por ejemplo,

1998 - Siete

1999 - Periscopio

2000 - CO2

El formato aquí es% Year% -% AlbumName%, que podría ayudarlo a identificar qué elemento del nombre de archivo es el álbum.

Para aclarar, tengo un patrón con el que hacer coincidir los nombres de archivo.

No conozco el nombre de archivo o patrón de antemano, todo es tiempo de ejecución.

Patrón:

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

Nombres de archivo:

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

Resultado esperado:

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

Nuevamente, el formato y los nombres de archivo no son siempre los mismos.

He escrito un renombrador de archivos de línea de comandos --- RenameWand --- eso hace el tipo de coincidencia de patrones que está describiendo. Sin embargo, está en Java, pero creo que parte del código fuente y la documentación de uso pueden ser de su interés. Un ejemplo simple de lo que puede hacer el programa:

Patrón de origen (especificado por el usuario):

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

Patrón de destino (especificado por el usuario):

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

Nombre de archivo original:

Kraftwerk-Computer World-03-Numbers.mp3

Nombre de archivo renombrado:

NUMBERS-013-computer world-Kraftwerk.mp3
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top