【问题标题】:Doing a search function on a txt file对 txt 文件执行搜索功能
【发布时间】:2013-08-29 16:14:25
【问题描述】:

我正在尝试创建一个搜索功能,这样当我搜索 White 时,它​​应该返回“#FFFFFF”。此外,它应该不区分大小写并支持部分名称输入。我拥有的文本文件包含以下格式的所有颜色编码信息:

"#FFFFFF"#White: "#FF0000"#Red:

我已经设法理解并到目前为止所做的如下;这基本上是映射到文本文件并指示它写入到文档末尾的行。我不明白的是如何实现上述要求。

我知道不是很多,但我不明白搜索功能背后的概念。

 protected void search_Click(object sender, EventArgs e)
        {
            StreamReader sr = new StreamReader("colorCode.txt");
            string line = null;

           while((line =sr.ReadLine()) !=null)
            {

            }

【问题讨论】:

  • 根据文件的大小,我可能会考虑将文件的全部内容读入一个字符串,然后使用正则表达式来执行搜索。

标签: c# visual-studio-2010 c#-4.0 webforms full-text-search


【解决方案1】:

在此示例中,colorCode 存储 colorToSearch 的匹配项

    protected void search_Click(object sender, EventArgs e)
{
    StreamReader sr = new StreamReader("colorCode.txt");
    string line = null;

    char []colorSeparator =  { ':' } ;
    string []colors ;

    char []colorCodeSeparator =  { '#' } ;
    string []codeAndColor ;

    bool found ;
    string colorToSearch ;
    string colorCode ;

    colorToSearch  = "White" ;
    found = false ;

    while(!found && (line =sr.ReadLine()) !=null)
    {
        //separate the content of the file "#FFFFFF"#White: "#FF0000"#Red: using ":" as separator
        colors = line.Split(colorSeparator) ;

        foreach(string color in colors)
        {
            codeAndColor = colors.Split(colorCodeSeparator) ;
            //codeAndColor[0] now contains the colorCode "#FFFFFF"
            //codeAndColor[1] contains the name of the color "White"

            //check if the name of the color in the file contains the colorToSearch allowing for case insensitive
            if(codeAndColor[1].ToUpper().Contains(colorToSearch.ToUpper()))
            {
                colorCode = codeAndColor[0].Substring(1,7) ; //the 1 is to skip the initial double quote, 7 is the number of caracter to take
                found = true ;
                //stop the foreach loop
                break ;
            }
        }
    }
}

如果您要进行更多搜索,我建议您从文件中仅加载一次 Dictionary<string,string> 中的颜色并在字典中执行搜索

【讨论】:

  • 嗨 Mauricio,我可以和你核实一下bool found ; 的目的是什么,是为了存储颜色吗?还有Substring(1,7) ; 是做什么的?
  • 表的实现也是这样的吗?替换 string []colorsvar colors_store = new Dictionary<string, string>()
  • @user2691544 变量“found”只是为了避免查看整个文件,当 find 为真时,它会中断 foreach 循环和 while 循环,找到的颜色存储在“colorCode”和子字符串中(1,7) 只取颜色代码的#234567 跳过双引号
  • 这是我根据您的建议所做的。 ` while (!found && (line = reader.ReadLine()) != null) { countries = line.Split(colorSeparator); foreach(颜色中的字符串颜色){ if (color.IndexOf(color_search)) { color_code = color;发现=假; Label2.Text = country_code; }`
  • 对不起。我发现您的代码最终更容易理解。关于显示所有相关搜索而不仅仅是一行,我该怎么做?例如,搜索“B”应产生所有“B”的结果,例如蓝色、黑色、棕色。
【解决方案2】:

不是每次都打开文件,如果文件不是很大并且在程序运行时没有更新,也许你可以只读取一次并创建一个可以搜索的查找表,如下例所示.如果您需要不区分大小写的比较,或更复杂的方式来进行部分颜色匹配,则需要添加它。

public class ColorLookUpTable
{
    private readonly IDictionary<string, string> _colorTable;

    private ColorLookUpTable(IDictionary<string, string> colorTable)
    {
        _colorTable = colorTable;
    }

    public static ColorLookUpTable LoadFromFile(string fileName)
    {
        var colorTable = new Dictionary<string, string>();
        using (var reader = File.OpenText(fileName))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var colorPairs = line
                    .Split(new [] { ':' }, StringSplitOptions.RemoveEmptyEntries)
                    .Where(f => !string.IsNullOrWhiteSpace(f))
                    .Select(f => f.Trim());
                foreach (var colorPair in colorPairs)
                {
                    var fields = colorPair.Split(new [] { '#' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
                    if (fields.Length == 2)
                        colorTable[fields[1]] = colorTable[fields[0]];
                }
            }
        }
        return new ColorLookUpTable(colorTable);
    }

    public string FindColorCodeExactMatch(string colorName)
    {
        string colorCode = null;
        if (_colorTable.TryGetValue(colorName, out colorCode))
            return colorCode;
        return null;
    }

    public string FindColorCodePartialMatch(string colorName)
    {
        var colorCode = FindColorCodeExactMatch(colorName);
        if (colorCode == null) // No exact match. Need to do work
            // very simple partial mathching.
            colorCode = _colorTable.Keys.Where(k => k.Contains(colorName)).FirstOrDefault();
        return colorCode;
    }
}

用法:

var myColorLookupTable = ColorLookUpTable.LoadFromFile("colorCode.txt");
var colorCode = myColorLookupTable.FindColorCodeExactMatch("White");
var another = myColorLookupTable.FindColorCodePartialMatch("ack");

【讨论】:

  • 欢呼伙伴。这正是我正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2010-09-12
  • 2017-04-13
相关资源
最近更新 更多