我正在研究一些集成了几十个csv文件信息的C ++代码。它们都包含我想要提取的一些带时间戳的记录数据,但每个文件中的表示有些不同。表示之间的差异超出了不同的列顺序和列名称 - 例如,在一个文件中具有多列的一行可能是不同文件中的多行。
因此,我需要为每个文件进行一些自定义处理,以便将包含所有文件中必要信息的统一数据结构组合在一起。我的问题是,是否有一个首选的代码模式,以保持复杂性可管理和代码优雅?或者,如果有一个很好的案例研究,我应该检查一下过去是如何处理这种复杂性的。
(我觉得这样的东西在像perl这样的脚本语言中可能会更容易,但是现在这个项目是用C ++编写的。另外,我的问题更多的是关于是否有一个代码模式来处理这个 - 所以答案并不是'必须过于语言化。)
答案 0 :(得分:3)
您在问题中使用的几个词组很适合我:custom handling for each file
,representation is somewhat different
,complexity manageable
。基于以下事实:您将不得不根据csv文件的格式使用不同的解析算法变体,并且您(我可以说)想要松散地耦合您的解析机制,我建议{{3}模式。
策略模式将解析机制与CSV文件中包含的数据的用户分离。数据的用户对CSV文件的格式不感兴趣,他们只对该文件中的信息感兴趣,这使得策略模式成为一个很好的选择。如果解析机制之间存在相似之处,则可以同时使用strategy和策略模式来减少重复并利用继承。
通过使用策略模式,您可以根据需要将策略创建提取到template或factory method,从而进一步允许客户端与解析方法分离。
答案 1 :(得分:0)
我不太确定你想用不同的文件做什么。如果想要像数据库表那样使用它们,并且你有一些密钥和附加信息分散在多个文件中,你可能想看看像MapReduce这样的东西,你可以在这里建立每个文件的部分信息首先,在第二步中聚合共享相同密钥的信息。
对于数据结构,它取决于文件的布局。对于每种文件类型,我可能都有一个专用的阅读器,它将信息存储在代表文件中信息的专用数据结构中。您可以为每个信息附加一个密钥,并使用reduce操作使用相同的密钥合并所有信息片段,并将它们聚合在一个代理结构中。
另一方面,如果想要从不同的序列化方法构建相同的对象(即不同的文件是独立的但是代表具有不同布局的相同类型的数据),则事先不知道采用了哪种序列化方法,我担心唯一的解决方案是强制反序列化。您可以拥有一组读取器,每个输入类型一个,并尝试解析该文件,如果失败,下一个启动,依此类推,直到您发现新的文件格式或找到适当的读取器。我认为没有任何模式可以解决这个问题。