none
Buscar fechas dentro de una cadena de Texto RRS feed

  • Pregunta

  • Deseo hacer un programa que me ordene los archivos de imagenes dentro de directorios por fechas, el problema es el siguiente:

    Para la fecha del archivo quiero obtenerla del nombre del archivo, algunos ejemplos son:

        20181208_101500.jpg

        IMG-20190319-WA0053.jpg

        IMG_20190121_153427.jpg

        scanner_20190627_105031.jpg

        Screenshot_2018-12-30-12-21-26-294_com.miui.home.png

    Como pueden ver pueden existir diferentes formatos de fecha dentro de los nombres de los archivos y estar en cualquier posicion, lo que queria saber es si se puede utilizar algo asi como expresiones regulares o algo para detectar si el nombre del archivo contiene una fecha y con el dato de la posicion de la fecha hacer un DateTime.ParseExact para convertirlo en fecha

    lunes, 7 de octubre de 2019 18:54

Todas las respuestas

  • hola

    Podrias aplicar algo para los 3 primero tipos de archivos ya que la fecha tiene alguna similitud, pero para el ultimo lo veo dificil

    var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
                    .Where(s => s.EndsWith(".jpg") || s.EndsWith(".png"));

    entonces luego ordenas

    var result = from file in files
                       let fecha = ObtenerFecha(Path.GetFileName(file))
                       orderby fecha
                       select file;

    entonces aplicas una estrategia por cada tipo de formato de nombre

    private DateTime ObtenerFecha(string fileName){
    
        if(fileName.StartsWith("IMG-")){
             string[] partes = fileName.Split('-');
             return DateTime.ParseExact(partes[1], "yyyyMMdd", CultureInfo.InvariantCulture);
        }
       
    
        if(fileName.StartsWith("IMG_")){
             string[] partes = fileName.Split('_');
             return DateTime.ParseExact(partes[1], "yyyyMMdd", CultureInfo.InvariantCulture);
        }
    
        if(fileName.StartsWith("scanner_")){
             string[] partes = fileName.Split('_');
             return DateTime.ParseExact(partes[1], "yyyyMMdd", CultureInfo.InvariantCulture);
        }
    
        if(fileName.StartsWith("Screenshot_")){
             string[] partes = fileName.Split('_');
             return new DateTime(int.Parse(parte[1]), int.Parse(parte[2]), int.Parse(parte[3]))
        }
    
    }

    por supuesto no aguegue todas las validaciones como ver si al cortar existen las parte o si hay errores de conversion, pero creo que la idea se entiende

    Nota: para usar Path.GetFileName() recuerda agregar el using System.IO

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 9 de octubre de 2019 0:26