2010-10-19 7 views
0

Je reçois une liste de noms de fichiers en utilisant le code suivant:La meilleure façon d'obtenir que certains groupes de une chaîne

 //Set up Datatable 
     dtUpgradeFileInfo.Columns.Add("BaseFW"); 
     dtUpgradeFileInfo.Columns.Add("ActiveFW"); 
     dtUpgradeFileInfo.Columns.Add("UpgradeFW"); 
     dtUpgradeFileInfo.Columns.Add("FileName"); 

     //Gets Upgrade information and upgrade Files from Upgrade Folder 
     DirectoryInfo di = new DirectoryInfo(g_strAppPath + "\\Update Files"); 
     FileInfo[] rgFiles = di.GetFiles("*.txt"); 
     foreach (FileInfo fi in rgFiles) 
     { 
      test1 = fi.Name.ToString(); 


     } 

Tous les noms de fichiers seront sous forme BXXXX_AXXXX_UXXXX. Où bien sûr les X représentent un nombre de 0-9, et j'ai besoin de ces 3 groupes de nombres justes pour les mettre dans leur colonne respective dans le Datatable. Au début, j'avais l'intention d'obtenir les caractères qui représentent chaque groupe et de les regrouper pour chaque groupe, mais je me demande s'il y a une meilleure façon de le faire que de l'envoyer à charArray. Aucune suggestion?

Répondre

2

est ici un moyen relativement simple d'obtenir les numéros de test1 (sans LINQ):

... 
string test1 = fi.Name.ToString(); 

int baseFW=0; 
int activeFW=0; 
int upgradeFW=0; 

// Break the file name into the three groups 
string[] groups=test1.Split('_'); 

if (groups.Length==3) 
{ 
    // Create a numbers array to hold the numbers 
    int[] nums=new int[groups.Length]; 

    // Parse the numbers out of the strings 
    int idx=0; 
    foreach (string s in groups) 
    nums[idx++]=int.Parse(s.Remove(0,1)); // Convert to num 

    baseFW=nums[0]; 
    activeFW=nums[1]; 
    upgradeFW=nums[2]; 
} 
else 
{ 
    // Error handling... 
} 

Si vous voulez faire cela en utilisant LINQ, il est encore plus facile:

... 
string test1 = fi.Name.ToString(); 

int baseFW=0; 
int activeFW=0; 
int upgradeFW=0; 

// Extract all numbers 
int[] nums=test1.Split('_') // Split on underscores 
       .Select(s => int.Parse(s.Remove(0,1))) // Convert to ints 
       .ToArray(); // For random access, below 

if (nums.Length==3) 
{ 
    baseFW=nums[0]; 
    activeFW=nums[1]; 
    upgradeFW=nums[2]; 
} 
else 
{ 
    // Error handling... 
} 
2

aide Les expressions régulières vous permettent d'analyser facilement les valeurs dont vous avez besoin et vous permettent également d'ignorer les fichiers situés dans le répertoire qui ne correspondent pas au format de nom de fichier attendu.

Votre code ressemblerait à quelque chose comme ceci:

 //Gets Upgrade information and upgrade Files from Upgrade Folder 
     string strRegex = @"^B(?<Base>[0-9]{4})_A(?<Active>[0-9]{4})_U(?<Upgrade>[0-9]{4}).txt$"; 
     RegexOptions myRegexOptions = RegexOptions.ExplicitCapture | RegexOptions.Compiled; 
     Regex myRegex = new Regex(strRegex, myRegexOptions); 

     DirectoryInfo di = new DirectoryInfo(g_strAppPath + "\\Update Files"); 
     FileInfo[] rgFiles = di.GetFiles("*.txt"); 
     foreach (FileInfo fi in rgFiles) 
     { 
      string name = fi.Name.ToString(); 
      Match matched = myRegex.Match(name); 
      if (matched.Success) 
      { 
       //do the inserts into the data table here 
       string baseFw = matched.Groups["Base"].Value; 
       string activeFw = matched.Groups["Active"].Value; 
       string upgradeFw = matched.Groups["Upgrade"].Value; 
      } 
     } 
+1

RegEx est definitly une bonne façon de le faire, et laisse une ouverture pour dépensant la solution à de nombreux problèmes plus complexes sans trop d'effort. La seule honte est que MS a rendu l'utilisation de Regex un peu plus compliquée que d'autres solutions. – Neowizard

+0

Il est également inefficace si l'entrée est de forme fixe. Performance sage, String.Split devrait être utilisé de préférence à reg-ex. –

+0

@Michael Goldshteyn, cela dépend de ce que vous optimisez. Une routine d'analyse codée à la main bien conçue sera généralement capable de surpasser une regex du point de vue du cycle du CPU. Cependant, sauf si vous allez traiter des milliers d'éléments, la différence de performance est probablement sans importance. L'approche RegEx a l'avantage supplémentaire de valider la conformité des noms de fichiers avec le modèle attendu (quelqu'un qui lâche un readme_before_running.txt dans le répertoire provoquera une erreur avec d'autres approches). De plus, il peut être plus facile de s'adapter pour prendre en charge des formats valides supplémentaires. –

Questions connexes