2010-08-05 7 views
0
 
abc = tamaz feeo maa roo key gaera porla 
Xyz = gippaza eka jaguar ammaz te sanna. 

je veux faire une structcomment analyser ce texte dans C#

public struct word 
{ 
public string Word; 
public string Definition; 
} 

comment je peux les analyser et faire une liste de <word> en C#.

comment je peux l'analyser en C#

grâce à l'aide, mais il est un texte et il est pas sûr qu'une ligne ou plus si ce que je fais pour newline

+2

Quel est le motif de choisir d'utiliser un 'struct' plutôt qu'une classe?Et plus encore, le rendant mutable, avec des champs publics? Une structure immuable peut avoir du sens, bien qu'il soit tout aussi raisonnable d'utiliser une classe. –

+0

Pour une réponse à votre dernière édition à la question, jetez un oeil à ma réponse. Il utilise la méthode File.ReadAllLines pour gérer vos retours à la ligne. –

Répondre

0
// Split at an = sign. Take at most two parts (word and definition); 
// ignore any = signs in the definition 
string[] parts = line.Split(new[] { '=' }, 2); 

word w = new word(); 
w.Word = parts[0].Trim(); 

// If the definition is missing then parts.Length == 1 
if (parts.Length == 1) 
    w.Definition = string.Empty; 
else 
    w.Definition = parts[1].Trim(); 

words.Add(w); 
+0

Pas besoin de tableau. 'String.Split' accepte également le seul caractère' char' en tant que param – abatishchev

+0

Seule la surcharge 'params char []' accepte un seul 'char'. Les autres surcharges (comme le 'char [], int' que j'utilise ci-dessus) ont besoin d'un tableau explicite. –

+0

Salut, je ne sais pas pourquoi cela a été voté? –

4

Lire la ligne d'entrée par ligne et divisée par le signe égal.

class Entry 
{ 
    private string term; 
    private string definition; 

    Entry(string term, string definition) 
    { 
     this.term = term; 
     this.definition = definition; 
    } 
} 

// ... 

string[] data = line.Split('='); 
string word = data[0].Trim(); 
string definition = data[1].Trim(); 

Entry entry = new Entry(word, definition); 
+2

Il suffit d'ajouter. Trim() pour se débarrasser des espaces supplémentaires – Sruly

+0

@Super bon point, merci! – thelost

0

Utilisez des expressions régulières

+0

Je ne suis pas en train d'évaluer votre réponse, mais je pense que ce serait un peu exagéré. – Manfred

2

Cela peut aussi être fait en utilisant une requête LINQ très simple:

var definitions = 
    from line in File.ReadAllLines(file) 
    let parts = line.Split('=') 
    select new word 
     { 
      Word = parts[0].Trim(), 
      Definition = parts[1].Trim() 
     } 
+0

Une solution vraiment concise, haut (et pensez-vous que l'expression rationnelle que je propose est bien?) –

1

En utilisant RegExp vous pouvez procéder de deux façons, en fonction de votre source d'entrée


Exemple 1

En supposant que vous avez lu source et enregistré une seule ligne dans un vecteur ou d'une liste:

string[] input = { "abc = tamaz feeo maa roo key gaera porla", "Xyz = gippaza eka jaguar ammaz te sanna." }; 

Regex mySplit = new Regex("(\\w+)\\s*=\\s*((\\w+).*)"); 

List<word> mylist = new List<word>(); 

foreach (string wordDef in input) 
{ 
     Match myMatch = mySplit.Match(wordDef); 

     word myWord; 

     myWord.Word = myMatch.Groups[1].Captures[0].Value; 
     myWord.Definition = myMatch.Groups[2].Captures[0].Value; 

     mylist.Add(myWord); 
} 

Exemple 2

Supposons que vous ayez lu votre source dans une seule variable (et toute ligne est terminée avec le caractère de saut de ligne '\ n'), vous pouvez utiliser la même expression rationnelle "(\ w +) \ s * = \ s * ((\ w +). *)" mais de cette manière

string inputs = "abc = tamaz feeo maa roo, key gaera porla\r\nXyz = gippaza eka jaguar; ammaz: te sanna."; 

MatchCollection myMatches = mySplit.Matches(inputs); 

foreach (Match singleMatch in myMatches) 
{ 

    word myWord; 

    myWord.Word = singleMatch.Groups[1].Captures[0].Value; 
    myWord.Definition = singleMatch.Groups[2].Captures[0].Value; 

    mylist.Add(myWord); 
} 

lignes qui correspond ou ne correspond pas à l'expression rationnelle "(\ w +) \ s = \ s * ((\ w +). ) ":

  • "abc = Tamaz feeo maa roo clé porla de gaera, qsdsdsqdqsd \ n" ->match
  • !" Xyz = gippaza Eka te jaguars ammaz Sanna. sdq = sqds \ n "->match vous pouvez insérer une description qui comprend des espaces trop
  • ! " Qsdqsd = \ nsdsdsd \ n" ->match une paire multiligne trop
  • " sdqsd = \ n » ->ne correspondent pas (descr manque)
  • ! "= sdq sqdqsd \ n" -.!>ne correspondent pas (mot manquant)
+0

Je voudrais utiliser un @ pour inhiber l'expansion backslash, ce qui rend plus facile à lire l'expression régulière de cette façon Regex mySplit = new Regex (@ "(\ w +) \ s * = \ s * ((\ w +). *)"); – mico

+0

You'right Mico, J'ai encore foiré, mais j'ai écrit ces lignes rapidement –

Questions connexes