2009-09-21 8 views
1

J'ai un ensemble de valeurs basées sur que j'ai divisé la chaîneC# - problème avec la chaîne de division

string[] seperator = new string[9]; 
     seperator[0] = "*"; //is the client 
     seperator[1] = "/"; //is the name of company 
     seperator[2] = "(";  //name of the market  
     seperator[5] = ":"; //ID 
     seperator[6] = "?"; //orderType 
     seperator[3] = "[email protected]"; //realtive Time 
     seperator[4] = "!+"; // 
     seperator[7] = "+"; //quantity 
     seperator[8] = "@";//price 
string[] result = values.Split(seperator, StringSplitOptions.None); 

Par exemple: La chaîne d'entrée est * A/AB (M @ 12: 6! ! SIMPLE + 5 + 2

 
OUTPUT 
    [0]: "" 
    [1]: "A" 
    [2]: "AB" 
    [3]: "M" 
    [4]: "12" 
    [5]: "6" 
    [6]: "SIMPLE" 
    [7]: "5" 
    [8]: "2" 

Par exemple:?! La chaîne d'entrée est * A (M @ 12 SIMPLE + 5 + 2/AB: 6

 
OUTPUT: 
    [0]: "" 
    [1]: "A" 
    [2]: "M" 
    [3]: "12" 
    [4]: "SIMPLE" 
    [5]: "5" 
    [6]: "2" 
    [7]: "AB" 
    [8]: "6" 

Le problème auquel je suis confronté est: comment puis-je rapporter que A est le client, AB est la société .. etc etc

comme l'ordre dans lequel l'utilisateur peut entrer cette information RANDOM ... S'il doesnot entrer l'une de ces valeurs, cela change la longueur du résultat?

+0

S'il n'y a pas de marqueurs identifiant les champs et les ordres de champs sont aléatoires, je ne vois pas comment vous allez faire cela –

+0

désolé, j'ai seulement vu noe il y a des identifiants –

Répondre

1

En utilisant quelque chose comme ça

SortedList<int, string> list = new SortedList<int, string>(); 
      string[] seperator = new string[9]; 
      seperator[0] = "*"; //is the client 
      seperator[1] = "/"; //is the name of company 
      seperator[2] = "(";  //name of the market  
      seperator[5] = ":"; //ID 
      seperator[6] = "?"; //orderType 
      seperator[3] = "[email protected]"; //realtive Time 
      seperator[4] = "!+"; // 
      seperator[7] = "+"; //quantity 
      seperator[8] = "@";//price 
      string val = "*A/AB([email protected]:6?SIMPLE!+5+2"; 

      for (int iSep = 0; iSep < seperator.Length; iSep++) 
       list.Add(val.IndexOf(seperator[iSep]), val); 

vous donnera une liste des positions où les seperators commencent, dans l'ordre des entrées utilisateur, et vous pouvez utiliser sous-chaîne pour récupérer les valeurs

+0

Super ... ça a marché !! Merci astander et orsogufo –

5

Qu'en est-il de l'utilisation d'une ou de plusieurs expressions régulières avec des groupes de capture nommés et de l'indexation des correspondances par nom?

Vérifiez par exemple this msdn page ou this post.

Voici un exemple pour vous aider à démarrer:

using System; 
using System.Text.RegularExpressions; 

class Program { 
    static void Main(string[] args) { 

     Regex regex = new Regex(@"(?:\*(?<client>\w+))|(?:/(?<company>\w+))",RegexOptions.Compiled); 
     string input = "*A/AB([email protected]:6?SIMPLE!+5+2"; 

     foreach (Match match in regex.Matches (input)) { 
      if (match.Groups["client"].Success) { 
       Console.WriteLine("Client = {0}", match.Groups["client"].Value); 
      } else if (match.Groups["company"].Success) { 
       Console.WriteLine("Company = {0}", match.Groups["company"].Value); 
      } 
     } 


    } 
} 

Je sais que la syntaxe des expressions régulières peut sembler difficile à comprendre au début, mais ils sont un instrument très puissant à chaque fois que vous devez faire type d'opérations de texte. En outre, certains outils vous permettent de tester et d'écrire des expressions régulières, telles que Expresso et The Regulator.

3

Qu'en est effectuer un certain nombre de remplacements sur la chaîne d'entrée pour l'obtenir dans un format plus maniable. Par exemple.

inputString = inputString.Replace("*", ",Client=").Replace("/", ",Company="); 

Ensuite, vous pouvez partager sur « » et obtenir votre liste de chaînes avec leurs têtes, puis diviser ceux sur « = » pour obtenir le titre et la valeur.

+0

celui-ci a travaillé aussi !!! Merci –

Questions connexes