【问题标题】:Replace word with match in CSV用 CSV 中的匹配项替换单词
【发布时间】:2013-11-21 21:54:35
【问题描述】:
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,Laugh out loud”并替换它

但是,这仅适用于一次替换。如果我输入“Hi LOL”,它会输出“Hi LOL,Laugh out Loud”

但如果我输入“Hi LOL,你好吗?LMAO”,它会输出“Hi LOL LMFAO,笑死我的 A**,你好吗?”

谁能告诉我哪里出错了,我不知道为什么会这样

【问题讨论】:

  • 我无法理解这应该做什么,但在我看来,从文件中为消息中的每个单词读取整个字典有点奇怪,你不应该正在使用 Regex.Replace 进行简单的文本替换,如果您使用的是替换功能,则不需要单独执行“插入”。
  • 您可能应该编辑您的问题以清楚地显示输入消息、.CSV 文件的内容以及输出有什么问题。
  • 你说得对,已经做了一段时间了,所以我累了,把它改成了 messageText = Regex.Replace(messageText, word, line);
  • 除非“单词”是“正则表达式模式”,否则不要这样使用 Regex.Replace。如果您只是想在 messageText 中用 'line' 替换 'word',请使用 messageText.Replace(word, line)

标签: c# regex csv


【解决方案1】:

此方法存在一些问题: 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(' ');
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多