使用列表c#在txt文件中查找字符串

时间:2017-11-05 18:20:58

标签: c# string list

我试图找出<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语句,即使其中一个单词位于文本文件中。

关于如何使这项工作的任何建议?

提前致谢!

4 个答案:

答案 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();