2015-06-05 85 views
4

我讀看起來像這樣獲取文本行特定字符串後,在C#中

[1] 
Message=my string here 
EffDate=1/1/1995 
DeactDate= 
Modified= 
Note= 

[2] 
Message=my other string here 
EffDate=1/1/1995 
DeactDate= 
Modified= 
Note= 

我想Message=但只到行結束後得到的字符串的文件的內容。我不想要任何日期或筆記或任何東西。

我希望把兩個消息放入一個字符串數組或類似的東西。有什麼辦法可以做到嗎?

任何幫助表示讚賞。

回答

2

這是你需要一個工作代碼:

var d = File.ReadAllLines(filePath); 
      var t = d.Where(g => g.Contains("Message")); 
      string[] splited; 
      foreach (var item in t) 
      { 
       splited = item.Split(new string[] { "Message=" }, StringSplitOptions.None); 
       Console.WriteLine(splited[1]); 
      } 

讓我知道如果您有任何困惑。

+0

您不能在** = **上使用split,因爲它可以是Message =後的字符串的一部分。 –

+0

@MaheshChand:有用戶提到= sign可以出現一次還是多次?爲什麼你下了投票呢? –

+0

@SimpleMan讓我們一起倒下他吧! :) – user35443

1

您可以使用followin方法。

  1. 閱讀您的文件,用最好的方法ReadAllLines,請看看link

  2. 閱讀你會得到字符串的集合,每行一個項目之後。

  3. Write方法檢查是否從文件線路從消息
  4. 開始。如果是,請使用String.Split方法用「=」符號,並添加索引1的元件,以消息的你的輸出集合。

我希望這是可以理解的。

+1

不能上使用分裂** = **,因爲它可以是字符串的消息後,一部分=。 –

1

你可以做這樣的事情

string[] getMessages(string file) { 
    List<string> messages = new List<string>(); 

    string[] lines = file.ReadAllLines();  /* read the lines */ 
    foreach(string line in lines) { 
     string[] parts = line.Split('='); 
     string contentPart = String.Join("=", parts.Skip(1).ToArray(); 
     if(parts[0]=="Message") 
      messages.Add(contentPart); 
    } 

    return messages.ToArray(); 
} 

雖然記住,這是不是很優雅,也沒有有效的解決方案。最好是解析整個文件,填充一個結構數組然後對其進行操作。

給一個理由爲什麼我用Split,而不是別的什麼:比較和嘗試列出不僅僅是Message更多的時候,它會成爲uneffective使用StartsWithContains

+0

您不能在** = **上使用split,因爲它可以是Message =後的字符串的一部分。 –

+0

@MaheshChand這還沒有說明。無論如何,我做了一個修正編輯。 – user35443

+0

還是錯的。另外,他沒有提到=在該行中只會出現一次。要清楚,請看看我的答案。 –

1

如果您已經閱讀文件,則只需將第一行存儲在包含字符串Message的字符串中,而不是將字符串拆分爲=並存儲在列表中。

string strFilePath = @"D:\Maraj\Work\Ajax.txt"; 
FileStream objFS = new FileStream(strFilePath, FileMode.Open); 
List<string> list = new List<string>(); 
using (StreamReader Sr = new StreamReader(objFS)) 
    { 
    while (Sr.ReadLine() != null) 
    { 
    string line = Sr.ReadLine(); 
    if(line.Contains("Message=") 
     { 
     list.Add(line .Split('=')[1]); 
     } 
    } 
    objFS.Close(); 
    } 
+0

您不能在** = **上使用split,因爲它可以是Message =後的字符串的一部分。 –

+0

用戶有問題說,該行將包含「消息=」; \ – Mairaj

+0

但他沒有說,=會在該行中只出現一次。要清楚,請看看我的答案。 –

0
  1. 閱讀從文本中的所有行。
  2. 每行檢查是否消息=存在於行首。
  3. 如果是,通過使用子串得到消息()方法

    var messages = File.ReadAllLines("M:\\m.txt"); 
        List<string> result = new List<string>(); 
        foreach (var msg in messages) 
        { 
         var key = "Message="; 
         if (msg.StartsWith(key)) 
          result.Add(msg.Substring(msg.IndexOf(key) + key.Length)); 
        } 
    
0

你只需要一個簡單的for循環:

string[] messages = File.ReadAllLines("data.txt"); //read all lines 

for (int i = 1; i < messages.Length; i = i + 7) //just get the line containing "Message" 
{ 
    string message = messages[i].Split('=')[1]; 
    //now you have the message, save it where ever you want. 
} 
+0

@DownVoter請評論並指出問題 – Shaharyar

+0

如果文本類似,您的答案將失敗.. Message =我的字符串在這裏,它也包含=並且它希望它在結果中 –

+0

@MaheshChand OP提供的測試用例不會'除了使用'Message'外,它包含任何'='。我們應該考慮OP的陳述,不應該遵循我們的假設。 – Shaharyar

相關問題