使用c ++解析大量数据

时间:2009-02-13 20:59:47

标签: c++ design-patterns qt architecture parsing

在我的工作中,我需要解析来自不同数据源的不同类型的数据文件。有时我通过直接编写c ++代码(在qt和boost:D的帮助下)解析它们,有时手动使用帮助程序。 我必须注意,数据类型彼此如此不同,很难为所有数据类型创建通用接口。但我想以更通用的方式完成这项工作。我打算编写一个库来转换它们,将来很容易添加新的解析器实用程序。我还计划在我的程序中使用其他帮助程序,而不是手动。 我的问题是你建议什么样的架构或模式,基本条件是库必须可以通过新的类或dll扩展,也可以配置。 顺便说一下,数据可以是文本,ascii或类似CSV(逗号分隔的值),大多数都是特定的数据。

3 个答案:

答案 0 :(得分:2)

不要吹我自己的小号,但是我的小型开源实用程序 CSVfix 具有可扩展的架构,该架构基于使用非常简单的界面派生新的C ++类。我确实考虑过使用带有DLL的插件架构,但对于这样一个简单的实用程序来说它似乎有些过分。如果有兴趣,你可以得到二进制文件&来源here

答案 1 :(得分:1)

我建议使用3部分模型,其中通用数据格式是一个String,它应该能够包含每个值:

  • Reader:在此层中,使用某种文件格式描述符从源(即CSV文件)中读取值。然后将这些值存储在某种中间数据结构中。
  • 连接器/转换器:该层负责将读取器数据映射到写入器字段。
  • Writer:该层负责将特定数据结构写入目标(即另一种文件格式或数据库)。

这样您可以为不同的输入文件编写不同的读者。

我认为最难的部分是创建中间存储格式/结构的定义,以便它具有前瞻性和灵活性。

答案 2 :(得分:0)

我用于在数据文件读/写类中定义数据结构的一种方法是使用std::map<std::string, std::vector<std::string>, string_compare>,其中键是变量名,字符串向量是数据。虽然这在内存中很昂贵,但它并不能将我锁定为只有数字数据。并且,此方法允许在同一文件中使用不同长度的数据。

我让基类实现了这个通用存储,而派生类实现了读写器功能。然后我使用工厂到达所需的处理程序,使用另一个确定文件格式的类。