2012-04-18 47 views
0

目前,我正在构建一个带有额外选项的议程。用 r n替换文本文件中的文本

用于测试目的我存储在一个简单的.txt文件 数据(之后,它会连接到一个虚拟助理的议程。)

要更改或从本txt文件我已经删除文本一个问题。 尽管需要替换的部分内容和搜索字符串完全相同,但并不代替内容中的文本。

代码:

更改方法

public override void Change(List<object> oldData, List<object> newData) 
    { 
     int index = -1; 
     for (int i = 0; i < agenda.Count; i++) 
     { 
      if(agenda[i].GetType() == "Task") 
      { 
       Task t = (Task)agenda[i]; 

       if(t.remarks == oldData[0].ToString() && t.datetime == (DateTime)oldData[1] && t.reminders == oldData[2]) 
       { 
        index = i; 
        break; 
       } 
      } 
     } 

     string search = "Task\r\nTo do: " + oldData[0].ToString() + "\r\nDateTime: " + (DateTime)oldData[1] + "\r\n"; 
     reminders = (Dictionary<DateTime, bool>) oldData[2]; 
     if(reminders.Count != 0) 
     { 
      search += "Reminders\r\n"; 

      foreach (KeyValuePair<DateTime, bool> rem in reminders) 
      { 
       if (rem.Value) 
        search += "speak " + rem.Key + "\r\n"; 
       else 
        search += rem.Key + "\r\n"; 
      } 
     } 

     // get new data 
     string newRemarks = (string)newData[0]; 
     DateTime newDateTime = (DateTime)newData[1]; 
     Dictionary<DateTime, bool> newReminders = (Dictionary<DateTime, bool>)newData[2]; 

     string replace = "Task\r\nTo do: " + newRemarks + "\r\nDateTime: " + newDateTime + "\r\n"; 
     if(newReminders.Count != 0) 
     { 
      replace += "Reminders\r\n"; 
      foreach (KeyValuePair<DateTime, bool> rem in newReminders) 
      { 
       if (rem.Value) 
        replace += "speak " + rem.Key + "\r\n"; 
       else 
        replace += rem.Key + "\r\n"; 
      } 
     } 

     Replace(search, replace); 

     if (index != -1) 
     { 
      remarks = newRemarks; 
      datetime = newDateTime; 
      reminders = newReminders; 
      agenda[index] = this; 
     } 
    } 

替代方法

private void Replace(string search, string replace) 
    { 
     StreamReader reader = new StreamReader(path); 
     string content = reader.ReadToEnd(); 
     reader.Close(); 

     content = Regex.Replace(content, search, replace); 
     content.Trim(); 

     StreamWriter writer = new StreamWriter(path); 
     writer.Write(content); 
     writer.Close(); 
    } 

当在调试运行我得到正确的信息:

content "-- agenda --\r\n\r\nTask\r\nTo do: test\r\nDateTime: 16-4-2012 15:00:00\r\nReminders:\r\nspeak 16-4-2012 13:00:00\r\n16-4-2012 13:30:00\r\n\r\nTask\r\nTo do: testing\r\nDateTime: 16-4-2012 9:00:00\r\nReminders:\r\nspeak 16-4-2012 8:00:00\r\n\r\nTask\r\nTo do: aaargh\r\nDateTime: 18-4-2012 12:00:00\r\nReminders:\r\n18-4-2012 11:00:00\r\n" string 

    search "Task\r\nTo do: aaargh\r\nDateTime: 18-4-2012 12:00:00\r\nReminders\r\n18-4-2012 11:00:00\r\n" string 

    replace "Task\r\nTo do: aaargh\r\nDateTime: 18-4-2012 13:00:00\r\nReminders\r\n18-4-2012 11:00:00\r\n" string 

但事实并非如此改变文字。我如何确保Regex.Replace找到正确的内容?

PS。我确实在这方面检查了几个主题,但没有提到的解决方案适用于我。

回答

0

您错过了:之后Reminders。只需再次检查它:)

+0

找到真正的原因,更新回答 – levanovd 2012-04-18 11:08:41

+0

非常感谢。我可以永远盯着那个,看不到它...... – 2012-04-18 11:15:35

0

你可以尝试使用StringBuilder建立你想写出来的文件。

只是在控制台应用程序中敲了一个快速示例,但这似乎适用于我,我认为这可能是您正在寻找的。

 StringBuilder sb = new StringBuilder(); 

     sb.Append("Tasks\r\n"); 
     sb.Append("\r\n"); 
     sb.Append("\tTask 1 details"); 

     Console.WriteLine(sb.ToString()); 

     StreamWriter writer = new StreamWriter("Tasks.txt"); 
     writer.Write(sb.ToString()); 
     writer.Close(); 
+0

替换字符串是正确的,可能只是如果它可以在内容中找到搜索字符串 – 2012-04-18 10:45:59