【问题标题】:.net: Is there a way to read a txt file from bottom to top? [duplicate].net:有没有办法从下到上读取 txt 文件? [复制]
【发布时间】:2010-02-10 23:03:47
【问题描述】:

可能重复:
How to read a text file reversely with iterator in C#

我想知道是否有一种方法可以从下到上读取文本文件而不会造成任何性能损失,readLine,movenext 方法,但反过来,这种事情在 .net 中是否可行?

为了让事情更有趣,文本文件中有大约 100 000 行,所以我不能用 readall 作弊,反向...

更多细节:我有一个传入字符串值的集合,这些值以可以排序的 int ID 为前缀。不幸的是,我以错误的顺序获得了这些 ID。主要问题是字符串值的庞大数量,并且解决方案中没有 RDBMS。所以我真的需要一种方法来存储字符串值,然后在处理过程中颠倒存储顺序。想到文本文件是因为我目前没有更好的解决方案。

提前致谢。

【问题讨论】:

  • 必须有某种类型的低开销“窥视”方法。
  • 你不是说从下往上吗?
  • 是的,从上到下是一种标准的方式......
  • 虽然我很想为我在实现这个方面所做的工作获得更多的代表,但这确实是一个骗局:stackoverflow.com/questions/452902/…
  • 谢谢乔恩,我看到了你的回答,你认为正常添加行然后使用 ODBC 文本驱动程序以相反的顺序获取结果对我来说是否值得?

标签: .net


【解决方案1】:

为什么不使用 StreamReader 类的ReadToEnd() 方法,然后向后工作... 诚然,它并不漂亮,但它确实有效,我使用字节数组创建了一个 MemoryStream 实例,并将其用于 StreamReader 实例,使用指针 hocus-pocus,以反向方式读取数据。

不安全 { byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello World! Foo wuz ere and so wuz bar"); 使用 (MemoryStream mStream = new MemoryStream(b)) { 字符串 readStr; 使用 (StreamReader sr = new StreamReader(mStream)) { readStr = sr.ReadToEnd(); } Console.WriteLine(readStr); 固定 (char* beg = readStr) { char* p = beg + readStr.Length; 而 (p-- != 乞求) { Console.Write(*p); } } } }

【讨论】:

  • 该死!刚刚在我测试代码时关闭之前发布了这个......叹息
【解决方案2】:

好吧,如果你愿意深入研究,你大概可以使用二进制阅读器并自己阅读......

你必须找出相反的行尾,并弄清楚如何确保你有正确的编码。

我会说非常令人生畏。

【讨论】:

  • 你说得对,这很痛苦。不过很有趣:)
【解决方案3】:

只是一个一般性的答案。如果有某种peek() 方法,您可以将文件指针设置为filesize(或filesize - 1?),然后将指针递减,直到达到0。.NET 中可能有一些类对此进行了抽象出去。当然,您必须定义某种缓冲区大小(基本上定义您正在读取的文件的“块”的大小)。在这种情况下,上面的filesize - 1 可能会变为filesize - bufferSize,并且您的文件指针也会增加bufferSize

【讨论】:

    【解决方案4】:

    我认为你可以做到这一点,可以使用 PInvoke 通过 WINAPI 做到这一点。你需要创建一个内存映射文件,但只映射文件的末尾,然后向上。

    【讨论】:

      【解决方案5】:

      因此,您以错误的顺序获取值,但希望以正确的顺序检索它们。也许是一个

      Stack<T> 
      

      对你有用。

      http://msdn.microsoft.com/en-us/library/3278tedw.aspx

      表示相同任意类型的实例的可变大小后进先出 (LIFO) 集合。

      【讨论】:

      • 谢谢,知识渊博,但不幸的是,我最初使用一系列批处理调用来填充我的列表,否则效果会很好。
      【解决方案6】:

      StreamReader 类的 ReadBlock 方法允许您从特定位置读取。不确定性能,您可能只想将其读入数组,然后将其反转。

      【讨论】:

      • 会做,但不幸的是,由于内存限制和高容量,我无法将其全部加载到集合中。
      • ReadBlock 让您可以进入它正在写入的数组中的特定位置。它不允许您在阅读器中指定要读取 from 的索引。
      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多