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 :

[C#] Comparaison de 2 chaînes de caractères (Recherche d'un motif commun)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut [C#] Comparaison de 2 chaînes de caractères (Recherche d'un motif commun)
    Bonjour,

    Dans le cadre de mon projet, à un moment, j'ai besoin de comparer deux noms de fichiers entre eux.
    Ces fichiers à comparer se trouvent à l'origine dans 2 répertoires différents.
    Cela me sert à faire un 'suivi'.

    Donc voilà : j'ai 2 types de fichier :

    1. répertoire 1 => fichier de type CORFOU_20090606101500_toto.txt
    2. répertoire 2 => fichier de type CORFOU_20090606101500_???.txt


    La partie en rouge dans le nom du fichier correspond à la 'clé' du fichier.
    C'est un identifiant unique composé du type du fichier (ici CORFOU) et de la date à laquelle il a été traité (20090609101500)

    Le type du fichier et la date de traitement sont séparé par un underscore (_).

    C'est ce motif, typefichier_datetraitement, que je recherche à détecter dans que je compare mes fichiers.

    J'arrive déjà à récupérer les noms des fichiers du répertoire 1 et du répertoire 2 dans 2 ArrayList différents.

    Comment faire pour rechercher le motif commun quand je compare 2 fichiers du répertoire 1 et du répertoire 2 ?


    [EDIT]

    Le truc c'est qu'à chaque fois que je compare un fichier du répertoire 1 à la liste des fichiers du répertoire 2, je dois retrouver le motif dans le nom du fichier du répertoire 1 car il est différent à chaque fois (logique c'est une 'clé' unique)

    Voilà comment je me vois procéder en gros :

    1. J'ai donc mes 2 ArrayList contenant les nom des fichiers se trouvant dans le répertoire 1 et dans le répertoire 2

    2. Pour chaque fichier du répertoire 1:
    => détecter le motif du fichier
    => comparer ce motif pour voir s'il existe dans un des fichiers de répertoire 2

    3. Si on trouve le motif dans un nom de fichier du répertoire 2 => OK, on sait que le fichier est bon.

    [/EDIT]



    Merci de votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    Salut,

    Si j'ai bien compirs tu cherche tout simplement à récupérer le motif sur tes noms de fichier?

    Si tout tes fichiers ont un nom du type " typefichier_datetraitement_qqlchose.extention" il te suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string s = "CORFOU_20090606101500_toto.txt";
    s = s.Substring(0, s.LastIndexOf('_'));

  3. #3
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Bon j'ai finalement réussi à faire une méthode qui fait ce que je veux.
    => C'est à dire me renvoyer un objet de type ArrayList contenant des objets de type FileInfo correspondant aux fichiers dont on retrouve le même motif dans les 2 répertoires.

    Voici l'idée :

    1. dans mes répertoires, le nom de mes fichiers sera toujours de type :
    typefichier_datetraitement_nomFichier.extension
    ex : CORFOU_20090606153000_toto.txt
    CATNAT_20090605192200_titi.xls, ...

    2. Une 1ere fonction, ResearchTypeOfFile recupère dans un string le type du fichier (ex: CORFOU)

    3. Une 2ème fonction, ResearchTimeStampOfFile récupère dans un string le timestamp du fichier (ex : 20090606153000)

    4. Une 3ème fonction GetIdSchapelOfFile, utilise les 2 méthodes précédentes pour générer un string contenant le motif du fichier (ex: CORFOU_20090606153000)

    5. Une 4ème fonction, la fonction principale, récupère dans un ArrayList les FileInfo des fichiers ayant le même motif. On passe en paramètre de cette fonction le chemin des 2 répertoires dont on veut comparer les fichiers. Cette fonction s'appelle : GetFilesTransfertComplete.

    Voici ce que ça donne :
    (C'est pas forcément explicite vu que j'utilise des noms de variables correspondant au contexte de mon projet)


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
            # region ResearchTypeOfFile
     
            /* Méthode retournant le 'type' du fichier passé en paramètre.
             *  Cette méthode analyse le nom du fichier qui suit une nomenclature précise.
             * ex :  CORFOU_20090606101500_toto.txt => La méthode récupère 'CORFOU' */
            public static string ResearchTypeofFile(string fileName)
            {
                int indiceFirstUnderscore;
                string type = "";
     
                try
                {
                    indiceFirstUnderscore = fileName.IndexOf("_");
                    type = fileName.Substring(0, (fileName.Length - (fileName.Length - indiceFirstUnderscore)));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Le fichier '{0}' n'est pas dans le bon format ! \nIl n'est pas dans le format 'typeFichier_timestamp_...'", fileName);
                    Console.WriteLine(ex.Message);
                }
     
                return type;
            }
     
            #endregion
     
            # region ResearchTimestampOfFile
     
            /* Méthode retournant le 'timestamp' du fichier passé en paramètre.
             *  Cette méthode analyse le nom du fichier qui suit une nomenclature précise.
             * ex :  CORFOU_20090606101500_toto.txt => La méthode récupère '20090606101500' */
            public static string ResearchTimestampOfFile(string fileName)
            {
                int indiceFirstUnderscore;
                int IndiceSecondUnderscore;
                string timestamp = "";
     
                try
                {
                    indiceFirstUnderscore = fileName.IndexOf("_");
                    IndiceSecondUnderscore = fileName.IndexOf("_", (indiceFirstUnderscore + 1));
                    timestamp = fileName.Substring((indiceFirstUnderscore + 1), (((fileName.Length - indiceFirstUnderscore) - 1) - (fileName.Length - IndiceSecondUnderscore)));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Le fichier '{0}' n'est pas dans le bon format ! \nIl n'est pas dans le format 'typeFichier_timestamp_...'", fileName);
                    Console.WriteLine(ex.Message);
                }
     
     
                return timestamp;
            }
     
            #endregion
     
            #region GetIdSchapelOfFile
     
            /* Methode retournant l'ID SCHAPEL présent dans le nom d'un fichier
             * La nomenclature du nom du fichier pris en paramètre est de type : ex: CORFOU_20090606153005_toto.txt */
            public static string GetIdSchapelOfFile(string fileName)
            {
                string idSchapel;
                idSchapel = ResearchTypeofFile(fileName) + "_" + ResearchTimestampOfFile(fileName);
                return idSchapel;
            }
     
            #endregion
     
            # region GetFilesTransfertComplete
     
            /* Méthode qui récupère dans un ArrayList les objets 'FileInfo' des fichiers dont PELICAN a terminé le transfert.
             * NOTE : à ce stade, on ne sait pas si le transfert des fichiers recupérés est un succès ou s'est soldé par une erreur */
            public static ArrayList GetFilesTransfertComplete(string pathToDirectorySuiviTransfert, string pathToDirectorySasPelican)
            {
                DirectoryInfo dirSuiviTransfert = new DirectoryInfo(pathToDirectorySuiviTransfert);
                DirectoryInfo dirSasPelican = new DirectoryInfo(pathToDirectorySasPelican);
     
                FileInfo[] AllFilesInDirectorySuiviTransfert = dirSuiviTransfert.GetFiles();
                FileInfo[] AllFilesInDirectorySasPelican = dirSasPelican.GetFiles();
     
                ArrayList ListOfFilesTransfertComplete = new ArrayList();
     
                // Pour chaque fichier dans Le répertoire 'Sas Pelican'..
                for (int i = 0; i < AllFilesInDirectorySasPelican.Length; i++)
                {
                    string motifOfFileInSasPelican;
                    motifOfFileInSasPelican = GetIdSchapelOfFile(AllFilesInDirectorySasPelican[i].Name);
     
                    // Pour chaque fichier dans le répertoire 'Suivi Transfert'..
                    for (int j = 0; j < AllFilesInDirectorySuiviTransfert.Length; j++)
                    {
                        string motifOfFileInSuiviTransfert;
                        motifOfFileInSuiviTransfert = GetIdSchapelOfFile(AllFilesInDirectorySuiviTransfert[j].Name);
     
                        // Si les ID SCHAPEL des 2 fichiers sont identiques.. 
                        if (motifOfFileInSasPelican.Equals(motifOfFileInSuiviTransfert) == true)
                        {
                            // Le transfert du fichier a été réalisé par PELICAN (Terminé ou Erreur).
                            // On ajoute l'objet 'FileInfo' de ce ce fichier dans une liste
                            ListOfFilesTransfertComplete.Add(AllFilesInDirectorySasPelican[i]);
                        }
                    } 
                }
                return ListOfFilesTransfertComplete;
            }
     
            #endregion
    En gros les méthodes à utiliser pour mon problème sont Substring(), IndexOf() et Equals()

    Voilà, bonne journée.

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

Discussions similaires

  1. Comparaison de 2 chaînes de caractères
    Par saidma dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 19/10/2014, 23h00
  2. une simple comparaison de 2 chaînes de caractères
    Par pazka dans le forum Débuter
    Réponses: 3
    Dernier message: 10/12/2013, 06h48
  3. Réponses: 4
    Dernier message: 07/06/2007, 22h35
  4. Réponses: 3
    Dernier message: 16/05/2007, 14h41
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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