【问题标题】:Searching Multiple Results using Streamreader使用 Streamreader 搜索多个结果
【发布时间】:2013-03-30 21:31:05
【问题描述】:

有谁知道允许您使用 StreamReader 通过文本文件搜索字符串的方法,该方法允许您考虑查找结果的多个实例。基本上我正在创建一个预订应用程序,每次客户预订座位时,都会生成他们的 PrimaryKey、FirstName、LastName 以及数据网格上座位的坐标(我已将其用作预订座位的方法)然后保存到一个文本文件。

我希望能够读取 PrimaryKey 的多个实例,然后找到列出此 PrimaryKey 的每一行的座位坐标,并用这些坐标重新填充另一个类似的 datagridview,这一切都将被驱动通过组合框索引更改。

这似乎有点复杂,但如果有人可以提供帮助,请告诉我。

我只需要如何搜索多个实例的知识,所以在它找到字符串一次之后再查看文件的其余部分以找到另一个实例,我可以自己完成剩下的工作。

我正在使用 Visual Basic.Net 进行编码

【问题讨论】:

  • 您不想为此使用非结构化文件。如果它不是太大,则将其全部加载,加载并索引到文件。一个内存映射文件,有很多方法可以做到这一点。即使您坚持使用纯文本文件,也不意味着您必须以这种方式访问​​它。
  • 是的,但是如何在不使用任何其他类型文件的情况下多次搜索文本文件?有可能吗?

标签: vb.net


【解决方案1】:

是的,可以在一个文件中多次搜索,但您要么必须重新打开文件,要么倒回流 (FileStream.Seek)。 虽然非常低效。 如果它必须保持未排序和非结构化文件,请为其构建内存索引。

如果您的键是整数,请在流中创建一个键和位置的Dictionary<int,int>。 然后,当您想找到键 X 时,您使用 FileStream.Seek 移动到它,并读取一行以获取数据。如果您发现自己按 aeroplaneID 进行分组,请创建 Dictionary<Int, List<Int,Int>> 其中键是飞机 ID,列表是文件中主键和位置的列表。

您可以将所有这些都推到后台线程。您可以尝试变得非常聪明,并根据需要建立它们。就个人而言,虽然我会尝试将我的存储移动到更合适的格式。你努力做到这一点并不是因为你错过了一节课,而是因为你不应该努力。

类似

Dictionary<int, int> _fileIndex = new Dictionary<int,int>();
using(FileStream fs = new FileStream(DataFileName,FileMode.Open,FileAccess.Read))
{
   StreamReader reader = new StreamReader(fs);
   int lastPosition = 0;
   string currentLine = null;
   while(currentLine = reader.ReadLine() != null)
   {
      String[] data = currentLine.Split(new char[] {','});
      int key = int.Parse(data[0]);
      fileIndex.Add(key,lastPosition);
      lastPosition = fs.Position;
   }
}

NB 没有测试上述内容,应该有更多的错误检查。如果行中有很多数据,那么最好不要使用 split 并将所有内容拉到正确的分隔符处。还要注意您保持多少索引处于活动状态,不久之后它们会占用更多空间,而不仅仅是将整个内容读入内存。

然后你可以创建一个类或结构来实现文件中的一行,并编写一些代码 使用 FileStream.Seek) 到达那里。如果您想加载一堆它们,那么获取文件中每个位置的位置列表然后按顺序对它们进行排序是有意义的,那么您可以按照“顺序”将它们取出来翻阅文件。

【讨论】:

  • 你能用 Visual Basic 而不是 C# 编写这段代码吗?
  • 我使用转换器将您的代码转换为 VB.Net,而 fileIndex 似乎不是正确的命令
  • 我需要能够在具有多行的文本文件中找到多次出现的字符串,因此每次找到该字符串时,它都会在该行上找到我需要的另一条信息,以便我可以正确填充数据网格视图。我不知道你是否明白我的意思
  • _fileIndex 是一个变量。你的问题是关于必须多次阅读文本文件的问题。如果您想这样做并且不必多次阅读文件,请根据您的评论。你会适应使用分组的想法,关键是 this here 关键字。除非您知道可以搜索的每个关键词,否则您对重读无能为力。
  • PS 抱歉,没有发现 VB.Net 标签。
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 2012-06-06
  • 2015-09-11
  • 1970-01-01
  • 2012-10-11
  • 2017-10-01
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多