7

我正在编写一些 C++ 代码,这些代码集成了来自大约几十个 csv 文件的信息。它们都包含我要提取的一些带时间戳的记录数据,但每个文件中的表示方式有所不同。表示之间的差异超出了不同的列顺序和列名 - 例如,一个文件中的一行有多列可能是不同文件中的多行。

因此,我需要对每个文件进行一些自定义处理,以组合一个统一的数据结构,其中包含所有文件中的必要信息。我的问题是是否有首选的代码模式来保持复杂性易于管理和代码优雅?或者,如果有一个很好的案例研究,我应该检查一下过去是如何处理这种复杂性的。

(我意识到这样的事情在像 perl 这样的脚本语言中可能更容易,但该项目目前使用 C++。此外,我的问题更多是关于是否有代码模式来处理这个问题 - 所以答案不必语言过于具体。)

4

2 回答 2

3

您在问题中使用的几个短语让我印象深刻:custom handling for each file, representation is somewhat different, complexity manageable. 基于这样一个事实,您将不得不根据 csv 文件的格式使用不同的解析算法变体,并且您(据我所知)想要松散地耦合您的解析机制,我会推荐策略模式。

策略模式将解析机制与 CSV 文件中包含的数据的用户分离。数据的用户对 CSV 文件的格式不感兴趣,他们只对该文件中的信息感兴趣,这使得策略模式成为一个很好的选择。如果您的解析机制之间存在相似之处,您可以同时使用模板和策略模式来减少重复并利用继承。

通过使用策略模式,您可以将策略创建提取到您认为合适的工厂方法抽象工厂中,进一步允许客户端与解析方法分离。

于 2013-03-20T12:42:05.723 回答
0

我不太确定你想对不同的文件做什么。如果你的想法是像数据库表一样使用它们,并且你有一些带有分散在多个文件中的附加信息的键,你可能想看看像MapReduce这样的东西,你首先从每个文件中构建部分信息并聚合在第二步中共享相同密钥的信息。

至于数据结构,它取决于文件的布局。我可能会为每种文件类型配备一个专用阅读器,它将信息存储在表示文件中信息的专用数据结构中。您可以为每个信息附加一个键,并使用 reduce 操作使用相同的键合并所有信息片段并将它们聚合到代理结构中。

另一方面,如果想法是从不同的序列化方法构建相同的对象(即不同的文件是独立的,但代表具有不同布局的相同类型的数据),而不事先知道采用了哪种序列化方法,我恐怕剩下的唯一解决方案就是暴力反序列化。您可以拥有一组阅读器,每种输入类型一个,并尝试解析文件,如果失败,则开始下一个阅读器,依此类推,直到您发现新的文件格式或找到合适的阅读器。我不认为有任何模式涵盖这一点。

于 2013-03-20T12:17:49.710 回答