2011-09-10 4 views
0

Je travaille sur un fichier texte .. je veux savoir comment rechercher une chaîne dans un fichier texte, puis effectuer les opérations sur cette chaîne.J'ai écrit un code mais il y a un problème avec "si la condition", quand la chaîne particulière vient, le contrôle passe à la ligne suivante .. il n'effectue aucune opération sur cette chaîne .. Ci-dessous est la ligne du fichier texte dont j'essaye pour trouver « MerchantNo: 105838015 », puis effectuer une opération de sous-chaîne sur elle pour obtenir que le number..There est un espace entre la ligne .. MERCHANTNO: 105838015 AGENT CODE 00913comment rechercher une chaîne dans un fichier texte en C#

et voici le code:

StreamReader sr = new StreamReader(fldr); 
     string line = null; 

     while ((line = sr.ReadLine()) != null) 
     { 
      str = line.Trim().Split(' '); 
      for (int i = 0; i < str.Length; i++) 
      { 
       if (str.ToString().ToUpper().Contains("MERCHANTNO:105838015")) 
       { 
         //str = line.Split(' '); 
         string MNo1 = line.Substring(15, 23); 
         MNo = Convert.ToInt32(MNo1.ToString()); 
       } 
       break; 

      } 

      //MessageBox.Show("Line is:" +line); 
     } 

     MessageBox.Show("MerchantNo is:" +MNo); 

Dites-moi ce que je dois faire?

+0

Pourquoi appelez-vous substr avec 15, 23? –

+1

Cherchez-vous toujours exactement cette chaîne: ... 105838015? Si vous connaissez ce numéro a priori, vous n'avez pas besoin de l'analyser et de le convertir en Int32 parce que vous le connaissez déjà. de votre code vous le cherchez en dur. –

+0

voulez-vous transformer le flux de trous? Je ne sais pas quelle opération vous voulez faire - parce que votre code dit exactement ce que vous décrivez: ne faites que vérifier "MERCHANTNO: 105838015" et convertir une sous-chaîne à partir d'une variable int (?) MNo ... quoi * devrait * le code faire? – Carsten

Répondre

4

Je soupçonne que c'est le problème:

if (str.ToString()...) 

Vous appelez ToString sur un tableau de chaînes. Je vous soupçonne voulais dire:

if (str[i].ToUpper().Contains(...)) 

Cela dit, on ne sait pas pourquoi vous êtes alors en utilisant la ligne pour une sous-chaîne - ou pourquoi vous appelez MNo1.ToString() quand MNo1 est déjà une chaîne ...

je recommande également que vous utilisez:

if (str[i].IndexOf("MERCHANTNO:105838015", 
        StringComparison.CurrentCultureIgnoreCase) > -1) 

(ou quelque chose de similaire, en fonction de la culture que vous voulez utiliser) plutôt que chaque partie supérieure boîtier.

Vous devriez également envisager d'utiliser une boucle foreach au lieu d'une boucle for:

foreach (string part in line.Trim().Split(' ')) 
{ 
    if (part.IndexOf(...) > -1) 
    { 
     ... 
    } 
} 
+0

J'ai essayé d'utiliser if (str [i] .IndexOf ("MERCHANTNO: 105838015", StringComparison .CurrentCultureIgnoreCase)) mais il me montre une erreur qui "ne peut pas convertir implicitement le type 'int' en 'bool'" ... et aussi je vais essayer de faire comme vous avez suggéré d'utiliser foreach loop .. – Nazima

+0

@Nazima: Apologies , J'ai oublié de mettre le bit '> -1' avant - édité maintenant. –

0

Il est un peu déroutant ce que ce code censé faire, mais je suppose que vous voulez vous assurer que si le fichier contient ce merchantno? Vous devriez utiliser regex au lieu de sous-jongler.

Avec fichier texte:

MERCHANTNO:10583218015 AGENT CODE 00913 
MERCHANO: 10421523838015 AGENT CODE 00913 
Some teeeext MERCHANTNO:105838015 AGENT CODE 00913 
Some text salalala ME 

Et le code:

var regi = new Regex(@"MERCHANTNO:\s*([0-9]*)"); 
string need = "105838015"; 
bool found = false; 

using (StreamReader reader = new StreamReader("file.txt")) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     var match = regi.Match(line); 
     if (match.Groups.Count == 2) 
     { 
      if (match.Groups[1].Value == need) 
      { 
       found = true; 
       break; 
      } 
     } 
    } 
} 

Console.WriteLine("Found: {0}", found); 

Peut-être cela est ce que vous voulez? Répare-moi.

(test de chaîne pour la valeur, pour éviter 012 == 12 parsing int)

1

Je pense que si vous utilisez Expression régulière vous pouvez résoudre votre problème rapidement. Tout d'abord, lisez le fichier entier dans une variable, puis appliquez votre expression régulière à cela.

Vous pouvez utiliser regroupement dans votre expression pour obtenir le numéro séparément comme ci-dessous:

 int number = 0; 
     using (var sr = new StreamReader(fileName)) 
     { 
      string fileContent = sr.ReadToEnd(); 
      Regex regex = new Regex(@"(?<=.*MERCHANTNO:)(?<number>\d*)"); 
      var match = regex.Match(fileContent); 
      if (match.Groups["number"].Success) 
      { 
       number = Convert.ToInt32(match.Groups["number"].Value); 
      } 
     } 

     MessageBox.Show("MerchantNo is:" + number); 
Questions connexes