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 **,你好吗?"
任何人都可以告诉我哪里出错了,我无法弄清楚为什么会这样做
答案 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(' ');
}