2010-07-14 5 views
1

J'ai collection de chaînes similairesC#: Comment extraire efficacement des valeurs d'un format de chaîne prédéfini?

par exemple: chaîne 1: Nom du client est john, son nom est Glueck, son nom de l'entreprise est abc def technolgies llc, il a un solde de 60 dépenses de dollars.His le taux est de + 3,45%

chaîne 2: nom du client est steve, son nom est johnston, son nom de la société est société xyz, il a un solde de 800 dollars.His taux de dépenses est -212,86%

Maintenant, je dois extraire les valeurs comme John, Glueck, abc def technolgies llc, 60, + 3,45 de la chaîne 1 et Steve, Johnson, xyz corporation, 800, -212.86 de la chaîne 2.

Dans notre environnement de production chaque chaîne est assez grande et j'ai environ 83 champs à extraire de chaque chaîne. Quel est le meilleur moyen d'extraire ces valeurs?

Existe-t-il une méthode qui fait l'opposé de string.format, qui prend la chaîne de référence & la chaîne actuelle et renvoie les valeurs extraites?

+0

Pouvez-vous fournir un exemple réel de la chaîne? Au début, vous dites que ça ressemble à une phrase, mais ensuite vous donnez des valeurs séparées par des virgules. –

+1

Je crois que la chaîne CSV montre la * sortie * désirée. –

Répondre

10

A expressions régulières feront l'affaire.

namespace ConsoleApplication 
{ 
    using System; 
    using System.Text.RegularExpressions; 

    internal static class Program 
    { 
     private static void Main() 
     { 
      var expression = new Regex(
       @"Customer's first Name is (?<FirstName>[^,]+), " + 
       @"his last name is (?<LastName>[^,]+), " + 
       @"his company name is (?<CompanyName>[^,]+), " + 
       @"he has a balance of (?<Balance>[0-9]+) dollars\. " + 
       @"His spending rate is (?<SpendingRate>[^%]+)%"); 

      var line = @"Customer's first Name is john, his last name is glueck, his company name is abc def technolgies llc, he has a balance of 60 dollars. His spending rate is +3.45%"; 

      var match = expression.Match(line); 

      Console.WriteLine("First name......{0}", match.Groups["FirstName"]); 
      Console.WriteLine("Last name.......{0}", match.Groups["LastName"]); 
      Console.WriteLine("Balance.........{0}", match.Groups["Balance"]); 
      Console.WriteLine("Spending rate...{0}", match.Groups["SpendingRate"]); 

      Console.ReadLine(); 
     } 
    } 
} 

SORTIE

First name......john 
Last name.......glueck 
Balance.........60 
Spending rate...+3.45 

Après cela, vous pouvez effectuer une analyse syntaxique chaîne simple pour obtenir des valeurs numériques des chaînes. De plus, vous devrez probablement écrire une expression régulière plus robuste s'il y a des variations dans le format des entrées.

+0

+1 bel exemple de groupement nommé – Abel

2

(question: Vous chaîne d'entrée réelle est le texte intégral verbeux: « premier Nom du client est xxxx, son nom est xxxx, son nom de l'entreprise est xxxx » etc correcte?)

Le est probablement une bonne cas pour un Regex. Si vous utilisez l'option de compilation, vous devriez en tirer un raisonnement. C'est essentiellement le "string.format inverse" que vous avez demandé (avec un tas d'options supplémentaires).

MISE À JOUR:

// NOTE: pattern assumes a comma after spending rate 
    Regex regex = new Regex("Customer's first Name is (\w+), his last name is (\w+),his company name is ([\w\s]+), he has a balance of (\d+) dollars.His spending rate is ([^,]+)"); 

    string[] values = regex.Split(string1); 
+0

James, Regex semble être la voie à suivre. Pourriez-vous s'il vous plaît me partager l'expression regex que je devrais utiliser pour mon exemple de chaîne 1? – funwithcoding

Questions connexes