我试图找出<form-group for="" />
文件是否包含存储在名为.txt
的列表中的单词。通过读取Abreviated
文件中的值来填充此列表,如下所示;
csv
我想使用此列表来检查StreamReader sr = new StreamReader(@"C:\textwords.csv");
string TxtWrd = sr.ReadLine();
while ((TxtWrd = sr.ReadLine()) != null)
{
Words = TxtWrd.Split(Seperators, StringSplitOptions.None);
Abreviated.Add(Words[0]);
Expanded.Add(Words[1]);
}
文件是否包含列表中的任何单词。正在使用.txt
读取.txt
文件,并将其存储为字符串streamreader
。我必须尝试找到匹配的代码;
FileContent
这将始终返回else语句,即使其中一个单词位于文本文件中。
关于如何使这项工作的任何建议?
提前致谢!
答案 0 :(得分:2)
您可以使用key-value pair
数据结构将缩写词和相应的全字存储为键值对。在C#中,Dictionary
具有用于存储键值对的通用实现。
我重构了您的代码,易于重复使用。
internal class FileParser
{
internal Dictionary<string, string> WordDictionary = new Dictionary<string, string>();
private string _filePath;
private char Seperators => ',';
internal FileParser(string filePath)
{
_filePath = filePath;
}
internal void Parse()
{
StreamReader sr = new StreamReader(_filePath);
string TxtWrd = sr.ReadLine();
while ((TxtWrd = sr.ReadLine()) != null)
{
var words = TxtWrd.Split(Seperators, StringSplitOptions.None);
//WordDictionary.TryAdd(Words[0], Words[1]); // available in .NET corefx https://github.com/dotnet/corefx/issues/1942
if (!WordDictionary.ContainsKey(words[0]))
WordDictionary.Add(words[0], words[1]);
}
}
internal bool IsWordAvailable(string word)
{
return WordDictionary.ContainsKey(word);
}
}
现在,您可以在程序集中重用上面的类,如下所示:
public class Program
{
public static void Main(string[] args)
{
var fileParser = new FileParser(@"C:\textwords.csv");
if(fileParser.IsWordAvailable("abc"))
{
MessageBox.Show("Match found");
}
else
{
MessageBox.Show("No Match");
}
}
}
答案 1 :(得分:0)
您正在将整个文件的内容与单词集合的字符串表示进行比较。您需要将文件内容中找到的每个单词与缩写列表进行比较。您可以进行比较的一种方法是将文件内容拆分为单个单词,然后根据缩略列表单独查看。
string[] fileWords = FC.Split(Separators, StringSplitOptions.RemoveEmptyEntries);
bool hasMatch = false;
for(string fileWord : fileWords)
{
if(Abbreviated.Contains(fileWord))
{
hasMatch = true;
break;
}
}
if (hasMatch)
{
MessageBox.Show("Match found");
}
else
{
MessageBox.Show("No Match");
}
我建议将缩写的集合切换为HashSet或字典,其中还包括缩写的匹配扩展文本。此外,可能还有其他方法可以使用正则表达式进行搜索。
答案 2 :(得分:0)
我不确定您的某些变量是什么,所以这可能与您的变量略有不同,但提供相同的功能。
static void Main(string[] args)
{
List<string> abbreviated = new List<string>();
List<string> expanded = new List<string>();
StreamReader sr = new StreamReader("textwords.csv");
string TxtWrd = "";
while ((TxtWrd = sr.ReadLine()) != null)
{
Debug.WriteLine("line: " + TxtWrd);
string[] Words = TxtWrd.Split(new char[] { ',' } , StringSplitOptions.None);
abbreviated.Add(Words[0]);
expanded.Add(Words[1]);
}
if (abbreviated.Contains("wuu2"))
{
//show message box
} else
{
//don't
}
}
正如其中一条评论所述,Dictionary可能更适合这一点。
这假设您文件中的数据采用以下格式,每行都有一个新设置。
wuu2,你在忙什么
答案 3 :(得分:0)
如果您要做的只是检查文本文件是否包含列表中的单词,您可以将文件的全部内容读取为字符串(而不是逐行),在分隔符上拆分字符串,然后检查文本文件和单词列表中的单词的交集是否包含任何项目:
// Get the "separators" into a list
var wordsFile = @"c:\public\temp\textWords.csv"; // (@"C:\textwords.csv");
var separators = File.ReadAllText(wordsFile).Split(',');
// Get the words of the file into a list (add more delimeters as necessary)
var txtFile = @"c:\public\temp\temp.txt";
var allWords = File.ReadAllText(txtFile).Split(new[] {' ', '.', ',', ';', ':', '\r', '\n'});
// Get the intersection of the file words and the separator words
var commonWords = allWords.Intersect(separators).ToList().Distinct();
if (commonWords.Any())
{
Console.WriteLine("The text file contains the following matching words:");
Console.WriteLine(string.Join(", ", commonWords));
}
else
{
Console.WriteLine("The file did not contain any matching words.");
}
Console.Write("\nDone!\nPress any key to exit...");
Console.ReadKey();