2011-09-10 13 views
0

テキストファイルで文字列を検索し、その文字列の操作を実行する方法を知りたいです。特定の文字列が来たときに、 ""という条件で何らかの問題があります。制御は次の行にスキップします。その文字列の操作は実行されません。 以下は、私が試しているテキストファイルの行です「MerchantNo:105838015」を見つけるためにのみnumber..Thereを取得するために、その上に、次に実行するサブストリングの操作は、ライン間のスペース..です MERCHANTNO:105838015エージェントコード00913C言語でテキストファイル内の文字列を検索する方法

そして、これはコードです:

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); 

どうすればいいですか?

+0

なぜあなたは15、23でSUBSTRを呼ぶのですか? –

+1

あなたは常にその文字列を探していますか:... 105838015?先にこの番号を知っていれば、単純に既に知っているので、解析してInt32に変換する必要はありません。あなたのコードからあなたはそれがハードコードされているのを探しています。 –

+0

ホールストリームを変換しますか?私はあなたが何をしたいのかわからない - あなたのコードはあなたが何を記述しているか正確に言うので、何もしないで "MERCHANTNO:105838015"をチェックしそこから部分文字列をint変数(?)に変換するMNo ... what * *コードはすべきですか? – Carsten

答えて

4

私はこれが問題であると思われる:

if (str.ToString()...) 

あなたは文字列配列にToStringを呼んでいます。私はあなたが意味を疑う:

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

あなたはその後、サブ用ラインを使用している理由、それは明らかではない、と述べた - またはMNo1はすでに文字列であるとき、なぜあなたはMNo1.ToString()を呼んでいる...

私はまた、あなたが使用することをお勧めします。(使用したいものを文化に応じて、または類似した何か)

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

ではなく、各部分を上部ケーシング。

あなたはまた、 forループの代わりに foreachループを使用することを検討すべきである

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

if(str [i] .IndexOf( "MERCHANTNO:105838015"、 StringComparison .CurrentCultureIgnoreCase)) しかし、それは私に "暗黙のうちに型 'int'を 'bool'に変換することはできません"というエラーを示しています...また、foreachループを使って提案したようにします。 – Nazima

+0

@Nazima: 、私は '> -1'ビットを前編集していたのを忘れてしまった。 –

0

それだファイルは、このmerchantnoが含まれている場合、このコードが行うことになって、私はあなたが確認してくださいしたいと思いますどのような混乱ビット?部分文字列ジャグリングの代わりに正規表現を使うべきです。

テキストファイルの場合:

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

とコード:

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); 

たぶんこれが何をしたいのですか? Fixme。

(値の文字列のテスト、012 == 12 int型の解析を回避するため)

1

あなたはすぐにあなたの問題を解決することができ正規表現を使用する場合、私は思います。 まず最初に、変数内のファイル全体を読み込んで、それに正規表現を適用します。

あなたは、別途下記のような数を得るためにあなたの式にをグループ化を使用することができます。

 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); 
関連する問題