2017-02-02 8 views
0

で解析します。テキストファイルを解析しようとしましたが、問題が発生しました。私は "メッセージ"という言葉の後に一行を読む必要がありました。特定の単語の後の行をC#

ファイルには、次のようなサンプルデータが含まれています。

メッセージ
2005修理の自動アクスルドライバ側。

メッセージ
1508修復加水分解懸濁液。私はここでは2005年と1508

で始まる行を読みたいと思った。この場合

は私のコード

List<Record> records = new List<Record>(); 

using (FileStream fs = new FileStream("SampleData.txt", FileMode.Open)) 
{ 
    using (StreamReader rdr = new StreamReader(fs)) 
    { 
     string tempreadline; 
     tempreadline = rdr.ReadLine(); 
     while (tempreadline != null) 
     { 
      if (tempreadline.Contains("MESSAGE") 
       { 
        // what do I do here? 
        // skip "MESSAGE" line and read the next line 
       } 
     } 
    } 
} 

は、任意の提案ですか?ありがとうございました!

+0

これはすべて文字列で指定されていますか?あなたは、オンザフライで解析する必要があるストリームがありますか?もっと情報が必要です。メモリ内に文字列がある場合は、 '' MESSAGE "'でそれを '分割する 'ことができます。 –

+0

あなたが試したことを説明するために、いくつかのコードを追加する必要があります。ログからテキストファイルを読んでいますか? – JaredStroeb

+0

正規表現を使用して、改行時に文字列を分割します。 C#: string [] arrAnswer = Regex.Split(段落、 "\ r \ n"); var theAnswer = arrAnswer [1]; –

答えて

1

あなたのアプローチを用いた方法1

Console.WriteLine("METHOD 1"); 

var records = new List<string>(); 

using (var fs = new FileStream("d:\\SampleData.txt", FileMode.Open)) 
{ 
    using (var rdr = new StreamReader(fs)) 
    { 
     var msgFound = false; 
     while (!rdr.EndOfStream) 
     { 
      var tempreadline = rdr.ReadLine(); 
      if (tempreadline.Contains("MESSAGE")) 
      { 
       msgFound = true; 
      } 
      else if (msgFound && !string.IsNullOrEmpty(tempreadline)) 
      { 
       records.Add(tempreadline); 
       msgFound = false; 
      } 
     } 
    } 
} 

records.ForEach(r => Console.WriteLine(r)); 

METHOD 2

あなたのテキストは単一の文字列であると仮定。

Console.WriteLine("METHOD 2"); 

var text = File.ReadAllText("d:\\SampleData.txt"); 
records = text.Split(new[] { "MESSAGE" }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(t => t.Trim(' ', '\r', '\n')) 
       .Where(t => !string.IsNullOrEmpty(t)) 
       .ToList(); 

records.ForEach(r => Console.WriteLine(r)); 

METHOD 3

あなたのテキストは文字列のリストであると仮定。

Console.WriteLine("METHOD 3"); 

var texts = File.ReadLines("d:\\SampleData.txt"); 
records = texts.Where(t => !string.IsNullOrEmpty(t) && !t.StartsWith("MESSAGE")) 
       .ToList(); 

records.ForEach(r => Console.WriteLine(r)); 

正規表現を使用する方法4

Console.WriteLine("METHOD 4"); 

records = new Regex(@"^MESSAGE[\s]*$", RegexOptions.IgnoreCase | RegexOptions.Multiline) 
       .Split(text) 
       .Select(t => t.Trim(' ', '\r', '\n')) 
       .Where(t => !string.IsNullOrEmpty(t)) 
       .ToList(); 

records.ForEach(r => Console.WriteLine(r)); 
+0

私はあなたの方法を試しました、そして、それはこのメッセージでメッセージにエラーで戻ってきました。引数1: 'string'から 'char'に変換できません。 – user6815384

+0

私のせいで、私の携帯電話に答えていた。更新された回答をご覧ください。 – mxii

+0

迅速な対応をありがとう。私はまだ新しい[] {"MESSAGE"}に似たようなエラーが出ます - 文字列[]を 'char'に変換できません – user6815384

0

ファイルに希望のコンテンツがある場合は、hereと記載されているFile.ReadAllLinesメソッドとLinq拡張メソッドの組み合わせを使用できます。配列DesiredLinesはさらに処理することができます。

var DesiredLines = File.ReadAllLines("C:\FileName.txt") 
         .Where(iLine => iLine != "MESSAGE" && iLine != "") 
         .ToArray(); 
関連する問題