用CSV替换匹配的单词

时间:2013-11-21 21:54:36

标签: c# regex csv

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中的单词替换为找到的单词。例如"嗨LOL"会发现" LOL,大声笑出来"在CSV中并替换它

然而,这仅适用于一次更换。如果我放入"嗨LOL"它会输出"嗨LOL,笑出来"

但如果我把"你好LOL,你好吗? LMAO"它输出"你好LOL LMFAO,笑我的A **,你好吗?"

任何人都可以告诉我哪里出错了,我无法弄清楚为什么会这样做

1 个答案:

答案 0 :(得分: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(' ');
    }