IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tester format nom fichier


Sujet :

C#

  1. #1
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut Tester format nom fichier
    Bonjour a tous,

    le titre est explicite, je souhaiterai tester le format du nom d'un fichier.

    En effet, pour les besoin d'un programme, j'ai la necessité de ne traiter que les fichiers portant un nom au format suivant :
    NAXXXXXX.ZZZZZZZZZZ.YYYYMMDDHHMM.CSV

    je pensais a utiliser la méthode .ToString() sur le nom du fichier, mais je ne vois pas comment m'y prendre :s

    Si qqn a une idée, je suis preneur

    Merci par avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Qu'appelle tu tester ?

    Si c'est vérifier qu'il est au bon format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    var reg =new System.Text.RegularExpressions.Regex(
    @"^NA[0-9]{6}\.[0-9]{10}\.(?<year>[0-9]{4})(?<day>[0-9]{2})(?<month>[0-9]{2})\.CSV$");
     
     
    var nomFichier = "NA129247.1245462876.20090808.CSV";
    if(reg.IsMatch(nomFichier))
    {//correspond peut-être
         var regmatch=reg.Match(nomFichier);
         var year =Convert.ToInt32( regmatch.Groups["year"].Value);
         var month = Convert.ToInt32(regmatch.Groups["month"].Value);
         var day= Convert.ToInt32(regmatch.Groups["day"].Value);
         if(year<1900||year>3000||month<=0||month>12||day<=0||day>DateTime.DaysInMonth(year,month))
    {//date n'est pas une date
    }else
    {
    // =======  CORRESPONDANCE ========
    }
    }else
    {// ne correspond pas
    }
    EDIT : sorry... yavait une erreur flagrante : corrigée.
    Ceci dit j'ai pas testé, mais ça devrait le faire

  3. #3
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    nikel.

    Pour ce qui est d'autoriser les caractère alphanumérique dans les premiere condition, il faudrait que je modifie la ligne par ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var reg =new System.Text.RegularExpressions.Regex(
    @"NA[0-9][A-Z][a-z]{6}\.[0-9][A-Z][a-z]{10}\.(?<year>[0-9]{4})(?<day>[0-9]{2})(?<month>[0-9]{2})\.CSV");

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    presque : [a-zA-Z0-9]{6}
    et si tu ne veux pas de minuscules : [A-Z0-9]{6}

    Renseigne toi sur les expressions régulières pour plus de détails.

  5. #5
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    merci,

    cependant, j'ai changé le code par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // teste ensuite si le format du nom de fichier correspond
                        var reg = new Regex(@"^[a-zA-Z0-9]{8}\.[a-zA-Z0-9]{10}\.(?<year>[0-9]{4})(?<month>[0-9]{2})(?<day>[0-9]{2})(?<hour>[0-9]{2})(?<minute>[0-9]{2})\.CSV$");
                        if (reg.IsMatch(Path.GetFileName(fichier)))
                        {//correspond peut-être
                            var regmatch = reg.Match(Path.GetFileName(fichier));
                            var year = Convert.ToInt32(regmatch.Groups["year"].Value);
                            var month = Convert.ToInt32(regmatch.Groups["month"].Value);
                            var day = Convert.ToInt32(regmatch.Groups["day"].Value);
                            var hour = Convert.ToInt32(regmatch.Groups["hour"].Value);
                            var minute = Convert.ToInt32(regmatch.Groups["minute"].Value);
                            if (year < 1900 || year > 3000 || month < 0 || month >= 12 || day < 0 || day >= 31 || hour <0 || hour >24 || minute < 0 ||minute > 60 )
                            {
                                Console.WriteLine("Le fichier " + fichier + " a un probleme de syntaxe sur le nom du fichier, la date n'est pas une date");
                            }
                            Console.WriteLine("Le fichier " + fichier + " sera traité");
                        }
                        else
                        {
                            Console.WriteLine("Le fichier " + fichier + " ne sera pas traité");
                            File.Move(fichier, p_pathDossierATraiter + "Erreurs/" + Path.GetFileName(fichier));
                        }
    Et il ne me reconnait tjrs pas mon fichier qui se nomme "NABCDE12.0123456ABC.201109131153.csv"

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    remplace \.CSV par \.(CSV|csv)

  7. #7
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    Effectivement
    Merci

    Encore un truc qui bloque :s mais apres je pense que ca en sera fini des merdes, ca sera juste de l'ajustment:

    sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var year = Convert.ToInt32(regmatch.Groups["year"].Value);
    il me ressort un erreur en me disant
    Le format de la chaîne d'entrée est incorrect.
    La valeur de "year" indique "0" et c'est pareil pour tous les champs month, day, hour et minute.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Et quand tu évalues regmatch.Groups["year"].Value dans le débugger, il te sort quoi ?

  9. #9
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    il met vide ("").

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Heuuu...
    Chez moi, ce code fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
                var reg = new Regex(@"^[a-zA-Z0-9]{8}\.[a-zA-Z0-9]{10}\.(?<year>[0-9]{4})(?<month>[0-9]{2})(?<day>[0-9]{2})(?<hour>[0-9]{2})(?<minute>[0-9]{2})\.CSV$");
                var fichier = "NABCDE12.0123456ABC.201109131153.CSV";
                if (reg.IsMatch(Path.GetFileName(fichier)))
                {//correspond peut-être
                    var regmatch = reg.Match(Path.GetFileName(fichier));
                    var year = Convert.ToInt32(regmatch.Groups["year"].Value);
                    var month = Convert.ToInt32(regmatch.Groups["month"].Value);
                    var day = Convert.ToInt32(regmatch.Groups["day"].Value);
                    var hour = Convert.ToInt32(regmatch.Groups["hour"].Value);
                    var minute = Convert.ToInt32(regmatch.Groups["minute"].Value);
                    if (year < 1900 || year > 3000 || month < 0 || month >= 12 || day < 0 || day >= 31 || hour < 0 || hour > 24 || minute < 0 || minute > 60)
                    {
                        Console.WriteLine("Le fichier " + fichier + " a un probleme de syntaxe sur le nom du fichier, la date n'est pas une date");
                    }
                    Console.WriteLine("Le fichier " + fichier + " sera traité");
                }
                else
                {
                    Console.WriteLine("Le fichier " + fichier + " ne sera pas traité");
                    //File.Move(fichier, p_pathDossierATraiter + "Erreurs/" + Path.GetFileName(fichier));
                }

  11. #11
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    ouais mais fais gaffe, tu donne une valeur défini a ta variable "fichier", or il faut que ca reste dynamique.

    Avant que je passe la valeur dans le Path.GetFileName, "fichier" vaut C:/ftp/NABCDE12.0123456ABC.201109131153.CSV

    je teste voir en stockant le path.getfilename dans une variable, voir si ca a une incidence, même si ca m'etonnerai.

  12. #12
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    d'ailleurs, je viens de tester avec la variable en fixe et ca fonctionne effectivement, mais ce n'est pas ce que je cherche :s

    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     var regmatch = reg.Match(m_fichier);
    il me retourne comme valeur {csv}, or il devrait me retourner tout le nom du fichier et l'extension.

    je continue a regarder pour les formats...

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 180
    Points : 4 496
    Points
    4 496
    Par défaut
    c'est pas à cause du "C:/ftp/"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory);
            // Create an array representing the files in the current directory.
            FileInfo[] fi = di.GetFiles("*.csv");
            Console.WriteLine("The following files exist in the current directory:");
            // Print out the names of the files in the current directory.
            foreach (FileInfo fiTemp in fi)
                Console.WriteLine(fiTemp.Name);

  14. #14
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    le c:/ftp/ dégage quand je fais le File.GetFileName(fichier)

  15. #15
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    je reve, c'était a cause de l'extension ... je viens de passer le nom du fichier en .CSV au lieu de .csv et ça passe

    par contre, ca a soulevé un autre problème, c'est que maintenant le test if (reg.IsMatch(m_fichier)) est permissif avec un fichier qui s'appele par exemple : nouveau fichier texte(6).csv

    jpige pas là :s

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    ben si ça finit par un "|csv" , c'est normal
    Le caractère "|" veut dire "OU"
    ^ signifie "début"
    $ signifie "fin"

    donc
    - "^abc|d$" matchera toute expression commençant par "abc" ou finissant par "d"
    - "^ab(c|d)$" matchera "abc" et "abd"

    (les parenthèses sont importantes)

    donc en l'occurence j'imagine que tu as fait finir ta chaine par :

    "\.CSV|csv$" et non "\.(CSV|csv)$" ?

  17. #17
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 180
    Points : 4 496
    Points
    4 496
    Par défaut
    Citation Envoyé par Nako_lito Voir le message
    d'ailleurs, je viens de tester avec la variable en fixe et ca fonctionne effectivement, mais ce n'est pas ce que je cherche :s

    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     var regmatch = reg.Match(m_fichier);
    il me retourne comme valeur {csv}, or il devrait me retourner tout le nom du fichier et l'extension.

    je continue a regarder pour les formats...
    .Match(string) doit te retourner un Match

    je reve, c'était a cause de l'extension ... je viens de passer le nom du fichier en .CSV au lieu de .csv et ça passe
    Logique dans le reg tu as laissé à la place de Grillé en même temps c'est icareo qui a fait tout le boulot

  18. #18
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    Whow !! Effectivement, je viens de matter un tuto sur les expressions régulières et j'ai vu la réponse apres.

    Merci en tout cas.

    Je mets mon code pour les suivant qui chercheraient une solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // teste ensuite si le format du nom de fichier correspond
                        var reg = new Regex(@"^[a-zA-Z0-9]{8}\.[a-zA-Z0-9]{10}\.(?<year>[0-9]{4})(?<month>[0-9]{2})(?<day>[0-9]{2})(?<hour>[0-9]{2})(?<minute>[0-9]{2})\.(CSV|csv)$");
                        var m_fichier = Path.GetFileName(fichier);
                        //var m_fichier = "NABCDE12.0123456ABC.201109131153.CSV";
                        //if (reg.IsMatch(Path.GetFileName(fichier)))
                        if (reg.IsMatch(m_fichier))
                        {//correspond peut-être
                            //var regmatch = reg.Match(Path.GetFileName(fichier));
                            var regmatch = reg.Match(Path.GetFileName(m_fichier));
                            var year = Convert.ToInt32(regmatch.Groups["year"].Value);
                            var month = Convert.ToInt32(regmatch.Groups["month"].Value);
                            var day = Convert.ToInt32(regmatch.Groups["day"].Value);
                            var hour = Convert.ToInt32(regmatch.Groups["hour"].Value);
                            var minute = Convert.ToInt32(regmatch.Groups["minute"].Value);
                            if (year < 1900 || year > 3000 || month < 0 || month >= 12 || day < 0 || day >= 31 || hour < 0 || hour > 24 || minute < 0 || minute > 60)
                            {
                                Console.WriteLine("Le fichier " + fichier + " a un probleme de syntaxe sur le nom du fichier, la date n'est pas une date");
                            }
                            Console.WriteLine("Le fichier " + fichier + " sera traité");
                        }
                        else
                        {
                            Console.WriteLine("Le fichier " + fichier + " ne sera pas traité");
                            File.Move(fichier, p_pathDossierATraiter + "Erreurs/" + Path.GetFileName(fichier));
                        }
    Encore merci !

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Si tu regardes un tuto sur les expressions régulières, tu ne trouveras pas forcément les explications pour les parties du genre (?<year> ... )

    Ce sont des captures nommées. Je crois que ce n'est pas un standard des expressions POSIX (en tous cas je ne les ai vues qu'en .Net) :
    un petit article pour t'y casser les dents

    Sinon :
    Un bon résumé de tout ce qu'il faut savoir sur les regex (mais ce n'est pas très explicatif)

    Un site de référence sur les regex : en l'occurence, ce lien est UN article de ce site assez technique sur un concept très puissant et plutot méconnu : les lookaround (Lookahead and Lookbehind Zero-Width Assertions)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Tester si nom de fichier ne commence pas par une chaîne
    Par v1cent dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 30/10/2013, 15h40
  2. XSL: Tester le nom d'un fichier
    Par xsmokingbenx dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 07/07/2009, 11h54
  3. Concatener la date au du nom fichier
    Par peppena dans le forum Linux
    Réponses: 5
    Dernier message: 09/02/2009, 12h53
  4. exp file= format nom de fichier
    Par cdu dans le forum Import/Export
    Réponses: 4
    Dernier message: 03/03/2006, 11h01
  5. [langage] tester si un fichier existe
    Par schnecke dans le forum Langage
    Réponses: 3
    Dernier message: 02/03/2004, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo