如何testing程序处理以不可预知格式存储的大量数据

我必须做的

我试图操纵一些存储在Excel文件中的大量数据(其中一个工作簿有多达150个电子表格)。 这些操作的结果可能会在数据库表中产生大约800.000行。

问题

存储在电子表格中的数据具有不可预知的格式。 生成这些电子表格的公司没有用于导出这些文件的固定/文档格式,有时会出现错误的数据。 例如,大多数年份被表示为“2009”,但有些情况下一年被表示为“20”。 其他例子,这些文件中的数据并没有真正规范化,所以我使用分隔符来分割某些单元格的值。 有时这些分隔符会改变。

有些事情是我无法预测的,只有在我的程序的一个已经进化的版本上运行了相当大一部分可用数据之后,才发现它们。

这个问题

在这种情况下,如何testing程序的正确性? 或者说,如何在没有运行整个可用数据的情况下实现相当稳定的产品版本?

如果出现某种意想不到的问题,我应该采取防御措施并抛出exception吗? 那么程序的主循环可能会捕获并logging它们并继续使用可用的数据? 这将产生一些处理过的数据,但这意味着在程序的后续迭代中,我必须检查以前的迭代(我不太喜欢)在数据库中已经存在的内容。

你怎么看? 你将如何解决这个问题?

如果没有关于数据格式的规范,那么任何东西都是可以接受的。

如果不是,那么就有数据的明确或隐含的规定。 我会试着把这个钉在眼下。 如果你不能够得到足够明确的数据定义来编写你的程序,以便它能够正常运行,那么我会说你正在冒很大的风险,造成一些严重的损害,这取决于这些数据是如何正在使用。

您应该编写程序,以便在跨不符合规范的数据运行时引发exception或logging错误。 然后,运行程序的可用数据的一部分,直到它毫无例外地运行。 这可以被看作是你的程序开发的一个训练集。 然后,使用一些保存的数据作为testing集。 这会给你估计你的程序在生产中会产生多less例外/错误。

过度拟合是一种常见的机器学习概念,但对其他任务(如程序开发)也很有用。 开发人员如何编写一系列unit testing,编写应用程序以便在其上运行良好,然后期望在生产中具有类似或无缺陷的性能,这一点令人惊讶。

如果你不愿意采取所有这些步骤(即在基本上所有的数据上运行你的代码 – 因为testing集也在使用这些数据),那么我认为这个任务太大了。

顺便说一句,与其创build一个对当前数据中所有“错误”非常奇怪和特殊的格式的定义,您可能需要创build一个新的,规范化的(就这些事情而言,这些事情被简化了)规范数据,然后编写一个“错误的文档修补程序”,可以运行在错误的文件来修复数据。

如果生成数据的应用程序仍处于生产阶段,那么您可能需要到此应用程序的开发人员处购买新规格。 一旦你有了这些,你可以开始logging他们的应用程序错误,所以希望错误的文件修补程序可以退休。

更可能的是,我猜测软件开发人员已经走了很久,没有人了解代码,甚至是运行。

在这种情况下,如何testing程序的正确性? 或者说,如何在没有运行整个可用数据的情况下实现相当稳定的产品版本?

对于每一种数据types,我都会对允许的值设置合理的约束。 如果一个单元格违反了这些约束,那么就抛出一个包含失败的数据的exception和它的数据types。 如果一段数据违反了它的约束条件,那么可以修改源代码以包含该段数据所需的附加约束条件,以及一个使其统一的转换方法。

举个例子,你给出的date,最初约会的约束可能只有四个数字。 当程序遇到“20”时,会抛出exception。 然后,你可以去允许两位数的date,以及一个方法将两位数的date转换成四位数的date,以便进一步处理。

一个问题是,你会不止一次运行你的程序? 从你的问题听起来你可能只想运行一次,然后你将使用数据库中的数据。

在这种情况下,您可以非常防守 – 只要出现意外的数据就会抛出exception。 在越来越多的数据集上反复运行程序。 最初,通过修改代码来解决任何exception情况,因为首先发现的exception将是常见的,这是一个很好的经验法则。 您可能需要在运行之间清空输出数据库。

稍后,您将发现罕见的例外情况,可能只会在input中出现几次。 只需手工解决这些问题,并自己在数据库中插入相应的行。 或者编写另一个读取exception信息并插入新行的小程序,而不是再次运行整个大程序。

通常对于这样的事情,我做这些@MarkJbuild议,我编码整个unit testing。

所以我编写了一个小数据文件,最初只包含几行正常数据。 这是unit testing编号1。

然后,我对一些数据进行快速视觉扫描,发现任何明显的例外情况。 unit testing2到n。

最后,我编写parsing器代码,直到它通过所有unit testing,并抛出并logging所有未pipe理数据的exception。

然后,我使用这些奇怪的数据位进行新的unit testing,并改进parsing器,直到它也可以通过。

尽pipe有时候容纳一些非常奇怪的数据会增加parsing器的复杂性,但是我只会loggingexception,转储它并继续前进。 这是一个专业判断的问题。

如何处理每一个数据(所以你不必检查傻瓜)。 那些通过进入数据库。 exception进入exception文件。 用户可以打开exception文件并对数据进行更正/修改。 然后他们可以在exception文件上运行你的程序。

这将隔离未处理的数据以供用户更正,并防止您两次(或更多)处理相同的数据。