2013-11-21 78 views
0
public void replaceText(string messageText) 
    { 
     int counter = 1; 
     string csvFile = "textwords.csv"; 
     string[] words = messageText.Split(' '); 
     char csvSeparator = ','; 

     foreach (string word in words) 
     { 
      foreach (string line in File.ReadLines(csvFile)) 
      { 
       foreach (string value in line.Replace("\"", "").Split('\r', '\n',  csvSeparator)) 
        if (value.Trim() == word.Trim()) // case sensitive  
        { 
         messageText = Regex.Replace(messageText, value, string.Empty); 

         messageText = messageText.Insert(counter, " " + line); 

        } 
      } 
      counter++; 
     } 
     MessageBox.Show(messageText); 
    } 

因此,我有上面的代码,它会搜索我的CSV文件以匹配messageText中的每个单词。 CSV文件包含textspeak缩写,并且每次找到匹配项时,都会将messageText中的单词替换为找到的单词。例如,“hi LOL”会在CSV中发现“LOL,笑出声来”,并将其替换为用CSV中的匹配替换单词

但是,这只适用于一个替换。如果我输入“Hi LOL”,它会输出“Hi LOL,大声笑”

但是如果我把“Hi LOL,你好吗?LMAO”输出“Hi LOL LMFAO,笑我A ** , 你好吗?”

谁能告诉我,我要去哪里错了,我想不通为什么它是这样做的

+1

我不能让我的周围是什么,这是应该做的头,但在我看来它有点匪夷所思从文件中读取整个字典中的每个字该消息,并且您不应该使用Regex.Replace进行简单的文本替换,并且如果您使用替换函数,则不需要单独执行“插入”。 –

+1

您应该编辑您的问题以清楚地显示输入消息,.CSV文件的内容和输出错误。 –

+0

你是对的,一直在这工作了一段时间,所以我很累 改变它只是 messageText = Regex.Replace(messageText,word,line); –

回答

0

有一些问题用这种方法: 1需要2个职责(负载键/值对从csv文件并替换文字)。每次调用时,csv文件都会被加载。 2变量'counter'对于该方法而言看起来很奇怪。

这里是重写代码:

static void Main(string[] args) { 
     var dictionary = LoadFromFile("c:\textWords.csv"); 
     var message = "Hi LOL, LMAO"; 
     message = ReplaceMessage(message, dictionary); 
     // 
    } 

    static Dictionary<String, String> LoadFromFile(String csvFile) { 
     var dictionary = new Dictionary<String, String>(); 
     var lines = File.ReadAllLines(csvFile); 
     foreach (var line in lines) { 
      var fields = line.Split(',', '\r', '\n'); 
      dictionary[fields[0].Trim()] = fields[1].Trim(); 
     } 
     return dictionary; 
    } 

    static String ReplaceMessage(String message, Dictionary<String, String> dictionary) { 
     var words = message.Split(' ', ','); 
     var s = new StringBuilder(); 
     foreach (var word in words) { 
      if (dictionary[word] != null) { 
       s.Append(String.Format("{0}, {1} ", word, dictionary[word])); 
      } else { 
       s.Append(word + " "); 
      } 
     } 
     return s.ToString().TrimEnd(' '); 
    }