2010-11-07 4 views
1

J'ai du mal à analyser du texte. Voici un exemple du texte:Séparer le texte des nombres en utilisant des expressions régulières dans VB.NET ... Je suis perplexe

201 BBQ     0.000 9.000 0.099 0.891 9.000 0.000 0.000 0.000 

    705 W 1 PC    0.000 135.000 0.295 39.825 0.000 0.000 135.000 0.000 

    2106 ONL 9.99   41.141 3.000 4.110 12.330 3.000 0.000 0.000 29.970 

Voici la dernière incarnation du code que j'ai essayé:

objInfo = System.Text.RegularExpressions.Regex.Split(
    newLine,"(\d{3,5})|([0-9]+[.]+[0-9]+)|(\w*)") 

Je vais avoir du mal parce que je suis en évitant d'obtenir de nombreux espaces vides dans la tableau après division. J'essaie d'éviter d'utiliser le caractère optionnel | mais je n'obtiens aucun résultat quand je le configure sans lui!

J'ai passé une grande partie de la soirée l'examen des expressions régulières et je l'ai téléchargé les programmes suivants:

RegEx Designer.NET Antix RegEx Tester Expresso

Je vais avoir du mal parce que la description contient parfois un point décimal et parfois non. La description contient parfois un nombre entier parfois non.

Mon ami m'a recommandé d'utiliser awk pour le diviser en colonnes. La chose est ... J'enseigne un cours d'éducation communautaire avec Visual Basic .Net et j'ai besoin d'améliorer mes compétences RegEx. Peut-être que quelqu'un peut me donner des conseils afin que je puisse mieux aider mes étudiants.

+0

Quel est le but de cet exercice? –

+0

Vous avez beaucoup de texte de remplissage dans votre question, mais vous avez oublié de mentionner quelques détails importants. Par exemple: aurez-vous toujours 8 colonnes de nombres décimaux? Comment les colonnes sont-elles séparées? (si elles sont séparées par des tabulations, vous pouvez utiliser 'newLine.Split ('\ t')' Quelle est la sortie attendue? – Kobi

+0

Non, elles ne sont pas séparées par des tabulations La sortie attendue est celle qui est entrée dans une base de données – Miamian

Répondre

2

Puisque vous connaissez le nombre de colonnes, vous pouvez commencer par lire 8 décimales à la fin de la ligne, et prendre le reste comme titre. Vous pouvez éviter une expression régulière, mais voici une solution simple avec un:

Match match = Regex.Match(line, @"^(.*)((?:\d+\.\d+\s*){8})$"); 
string title = match.Groups[1].Value.Trim(); 
IEnumerable<decimal> numbers = match.Groups[2].Value 
    .Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
    .Select(Convert.ToDecimal); 

Le regex capture deux groupes: ((?:\d+\.\d+\s*){8})$ est de huit décimales à la fin, et (.*) est le début de la piqûre jusqu'à eux. Si vous avez des décimales supplémentaires, comme votre troisième exemple, ils seront ajoutés au titre.

De même, vous pouvez choisir une solution non-regex (en fait, celui-ci est mieux si cela ne vous dérange pas de perdre quelques places au title):

string[] words = line.Split(" ".ToCharArray(), 
          StringSplitOptions.RemoveEmptyEntries); 
int position = words.Count() - 8; 
IEnumerable<decimal> numbers = words.Skip(position).Select(Convert.ToDecimal); 
string title = String.Join(" ", words.Take(position)); 
+0

Oh - tout est en C#, mais devrait facilement se traduire en VB.NET ':)' – Kobi

Questions connexes