【问题标题】:How should I read in data from a text file using .NET, with a TWIST!我应该如何使用 .NET 从文本文件中读取数据,使用 TWIST!
【发布时间】:2010-09-20 13:53:15
【问题描述】:

是的,这听起来像是一个新手问题,但有一个 TWIST! (And i've done an SO search already...)

我正在尝试读取多个文件,一次一个......而每个文件都可能将新数据附加到它的末尾。

我总是知道我最后一个字符的位置。

所以当我访问一个文件时,我在想我想在执行该行代码时从开始位置读取到当前结束位置

然后解析所有数据.. 并转到下一个文件。当我在解析该数据时,有可能新数据被附加到文件的末尾......直到我回来重新开始解析文件之前我不会得到它。

我有大约 300-400 个文件要解析 .. 这就是为什么我不特别想制作大量线程并且每个线程都有自己的数据库连接等等。随便什么..等等。

最后,每秒的新数据并不多。所以我不会永远“赶上”。

那么 .. 任何想法如何最好地做到这一点?

我还在解析每个“行”......其中一行是一些以“\n”结尾的文本,等等。

想法?

更新/重新编辑..

  • 不用担心我有很多文件并且想将数据存储到数据库中。我建议这样做的原因是人们没有开始建议每个文件使用多个线程、文件监视程序等......
  • 每个日志文件具有相同的结构等,只是数据/内容不同。不,我不想检测它们何时更新。我只想手动解析每一个,从最后一个流位置到当前结束位置。

【问题讨论】:

  • 您需要澄清几件事:1)您提到线程和数据库,数据库与您的文件有什么关系?您能否详细说明整个工作流程。 2) 是否所有文件都以相同的内容开头,只是或多或少完整,或者您是否有 300-400 个不同的(日志?)文件要在它们有更多数据时检测?
  • @Albin Sunnanbo 更新了开幕主题。

标签: .net parsing file


【解决方案1】:

拥有最后一个 字符 位置对您没有多大帮助。你想要的是最后一个 stream 位置(即以字节为单位)。这样,您只需打开文件的FileStream,寻找正确的位置,然后然后创建一个包装流的StreamReader

如果您在最初阅读时使用StreamReader,您应该能够通过在到达末尾时检查基本流的位置来获得最终位置...通常您必须担心StreamReader 缓冲了额外的数据(因此从文件中读取了更多数据),但是如果您已经到达文件的末尾,它就无法再读取了:)

【讨论】:

  • @Jon Skeet - 对不起。 i ment StreamReader 位置 - 正确 :) 目前,我有一个很大的长 StringBuilder 正在附加所有内容..当有数据时:` while ((streamPos = stream.Read(buffer, 0, 4096)) > 0) ... \\ append ..` .. 但这会杀死我处理的大文件:(所以我想可能有更好的方法来解析每一行,而不是读入所有数据,然后解析它.... ?
  • @Pure.Krome:你的意思是像TextReader.ReadLine()?目前尚不清楚您的行是否实际上以换行符或反斜杠后跟 n 终止。哦,阅读一个文本文件完全比你做的要简单得多:File.ReadAllText...
  • @Jon 将允许附加数据,而我读每一行..然后解析..然后再读?如果文件不断得到越来越多的东西会发生什么(并且解析需要一些时间)..有没有可能我永远不会到达最后..从而忽略其他文件?
  • @Pure.Krome:是的,阅读 File.ReadAllText 对增量阅读没有多大帮助。至于您是否永远不会到达流的末尾-如果发生这种情况,那么显然数据的创建速度比您解析它的速度要快,并且在不提高解析速度的情况下(例如,通过使用多个线程),您将永远赶不上。我无法回答这是否是一个真正的问题。
  • @Jon Skeet - 所以我无法循环通过流.. 但定义startend 流位置.. 而不是只是说.. 循环通过流直到 结束 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多