2011-02-27 23 views
7

在delphi中加载大文本文件数据的最佳方式是什么?有没有任何组件可以加载超文本文件?使用TStringList在Delphi中加载大文本文件的最佳方式是什么?

比方说,我有一个文本文件中包含的数据库和存储在固定长度格式。 它包含150个字段,每个字段至少有50个字符。 1.我需要将其加载到内存 2.我需要分析它,并可能将其存储在memdataset处理

我的问题:1。 它是不够的,如果我用TStringList.loadFromFile方法? 2.是否有任何其他更好的组件来操纵文本文件? 3.我应该使用文本文件中的低级别读数吗?

预先感谢您。

+0

TStrings.LoadFromFile使用2 * N内存,必须对大文件使用低级加载程序 – 2011-02-27 19:06:51

回答

11

的TStringList是从未有大量文字工作的最佳方式,但它是最简单的。如果你手上有小文件,你可以毫无问题地使用TStringList。即使你有大文件(不是大文件),你也可以使用TStringList来实现你的算法版本,用于测试目的,因为它简单易懂。

如果文件很大,因为他们很可能是因为你叫他们“数据库”,你需要寻找替代性技术,将使你只读,就像你从数据库中所需要的。调查:

  • TFileStream的
  • 内存映射文件。

不要看旧的“基于文件”的API仍然可以在Delphi中使用,它们很简单。

我不打算进入如何使用这些方法来访问文本细节,因为我们最近对SO两个类似的问题:

How Can I Efficiently Read The FIrst Few Lines of Many Files in Delphi

Fast Search to see if a String Exists in Large Files with Delphi

1

如果您发现问题很方便,我建议遵守TStringList。优化是以后应该做的另一件事。

至于TStringList优化是声明一个覆盖TStrings.LoadFromStream方法的后代类 - 您可以在考虑文件结构的情况下尽可能快地实现它。

2

既然你有,你正在使用一个固定的长度,你可以建立基于从TList与TWriter和踏浪,将您记录到的访问类别。你不会有任何TStringList的开销(不是它是一件坏事,但如果你不需要它,为什么它),你可以建立自己的访问记录到类中。 最终,这取决于您将数据加载到内存后要用数据完成的操作。虽然TStringlist易于使用,但并不像“自己滚动”那样高效。

然而,在数据处理的效率可能不是大问题,因为你是用文本文件保存数据库。如果您只需要阅读并根据文件中的数据作出决定,则更灵活的TList可能会过度杀伤。

+0

我怀疑每行的文本长度是否固定; OP说:“它包含150个字段,每个字段至少有50个字符。我认为固定数量是字段的数量。 – 2011-02-27 17:59:02

1

从你的问题中不完全清楚你为什么需要将整个文件加载到内存中,然后再创建一个内存数据集......你是否混淆了这两个问题? (也就是说,因为您需要创建内存数据集,您认为您首先需要将源数据完全加载到内存中,或者是否存在对源文件的一些初始预处理,这只能在整个文件加载到内存中(这是不太可能的,即使是这种情况,对于可导航的流对象如TFileStream也没有必要)。

但是我认为你正在寻找的答案就在这里。

如果您正在加载此文件以解析并填充/初始化其他数据结构(数据集)以供进一步处理,那么使用现有的高级数据结构是不必要的并且可能代价高的时间)step。

使用提供所需功能的最低级别访问方式。

在这种情况下,TFileStream可能会提供便利性和易用性之间的最佳平衡。

+0

我需要比较文件。我有两个输入文件,一个是主数据库,另一个是要比较的文件。我需要列出主数据库中与要比较的文件中的某些值相匹配的所有字段。 – WishKnew 2011-02-28 10:18:47

+0

这解释了你在做什么,但它仍然不能解释为什么你必须按照你看来已经决定的方式去做。我仍然不清楚你不能使用流来完成你所描述的内容。如果性能是一个问题,那么我会首先使用TFileStream实现 - 如果性能确实成为一个问题,您可以立即转换为TMemoryStream。如果有必要*然后*您可以根据您的具体性能问题实际来自哪里来查看更复杂的结构。 – Deltics 2011-03-02 00:46:53

相关问题