0

我需要读取文本文件,但它太大了,所以我决定只读取这个文件中的一些行。我可以使用 seek 方法来跳转给定的行吗?然后我只能读取该行,因为该文本文件太大,读取整个文件会浪费大量时间。如果不可能,有人会为此提供更好的解决方案吗?(寻找给定的行并阅读它)(我知道二进制文本文件正在逐字节读取)

我的档案前

event1 0

subevent 1

subevent 2

event2  3 

(在一个事件之后的我的文件中,它显示我想寻找前一个事件的行数)

4

4 回答 4

1

是的,您可以查找文件中的某个点,然后从那里读取。一个可能的问题是,如果行的长度都不同,则文件中的随机位置将有更高的概率位于较长的行中:您不会得到不同行的均匀分布概率。如果您真的必须具有相同的概率,那么您需要至少遍历文件以找到每一行的开头 - 然后您可以将这些偏移量存储在一个向量中并随机选择一个向量元素来指导寻找行数据在文件中。如果您只关心一点点,那么您也许可以将少量但随机的行数超过您最初寻求的行……这会增加一些可能性,避免最初的通过,但并不完美。汉斯玛德

于 2013-04-25T11:06:18.603 回答
0

据我所知,在不知道线路在哪里的情况下,没有内置的方法可以寻找新线路。我无法告诉您实现目标的最佳方法,因为您的大多数问题都详细说明了您如何尝试实现目标,而不是实际想要实现的目标。因此,我可能会采用以下两种方式之一:

1)如果您确实需要文件中的每一位数据(没有可以丢弃的元数据或其他信息):

有人提到扫描文件,跟踪行,并用它建立索引,这样你就可以一次读取一行。这可能会奏效,如果您实际上需要完整的每一行,或者您只需要行号并计划从那里一次读取小块,这将是可行的方法。但是,在不了解您的约束或要求的详细信息的情况下,我不建议使用此方法阅读整行,原因有一个:我无法知道一行本身不会太大而无法加载(如果只有文件中的一行?)。

相反,我将简单地分配一个大小合适的缓冲区,一次处理,并以该大小的块处理文件,直到你到达最后。您可以随时输入更多数据。如果没有其他详细信息,我无法告诉您该幻数应该是多少,但是您可能需要处理的最大信息块的大小至少是一个很好的起点。

2)如果您不需要文件中的每一位数据(您可以丢弃其中的一些信息),那么您只需要其中的一些。如果您只需要选择的数据片段,那么如果它们被标记(这就是 XML 的用途),则更容易找到它们。有很多免费的 XML 解析器,或者您可以编写自己的。然后,您将搜索标签而不是任意行号,并且对导致数据位于不同位置的文件的更改不会影响您找到它的能力,如果它被标记,就像您只是要去按行号。

于 2013-04-26T12:31:45.103 回答
0

除非每条线的长度完全相同,否则您将不得不扫描它。

如果您想在其中跳转,您可以扫描它,将每行的偏移量保存在您选择的容器中,然后使用它来寻找特定的行。

于 2013-04-25T11:05:23.167 回答
0

假设这些行是可变/随机长度的,我不相信有任何内置方法可以直接跳转到特定行的开头。您可以查找文件中的任意字节位置。但是,这可能会落在一行的开头/中间/结尾的任何位置。

我最好的建议是分两步解决问题:

首先,逐字节完整地遍历文件,搜索每一行的开头。记录每行的字节位置并将其存储到数组、向量等中。(基本上,您正在创建一个从行号映射到起始位置的索引。)然后,当您建立了这个索引时,您可以轻松跳转通过查找索引中的位置,到特定的行。

于 2013-04-25T11:06:54.553 回答