我将不得不生成许多包含随机数据的CSV文件。将有关于字段的规则,例如一些将是整数,一些应该是从特定列表中挑选的名称,一些将是从具有给定源的马尔可夫链生成的文本等。
我想使其灵活,因此可以更改CSV规范/模板,而无需进行任何编码更改。我的第一个想法是让模板本身也是一个CSV,它将字段名称映射到生成数据的规则,因此模板可能类似于以下内容:
device id,randint,unique
description,markov,tech.source
vendor,choice,vendors.txt
由此我可以生成一个包含3个字段的CSV,第一个是由随机整数组成的ID,其中包含"唯一的"约束,第二个是使用" tech.source"的马尔可夫链的叙述性描述。作为链定义,供应商是从另一个文本文件中定义的随机选择。
由于单个生成的CSV中可能有80个左右的字段,并且可能有许多相关的CSV文件引用彼此的元素(例如,可能存在人员列表,并且硬件可能拥有所有者必须在人员列表中),我倾向于创建一个类,该类封装了生成的CSV的每一行。
该类将存储dict映射字段名称到值,然后可以将这些值传递给csv.DictWriter
(这可能在Python中实现),该列表是使用正确顺序的字段列表创建的。这些类将能够实现比较运算符,以帮助映射不同的类型,并跟踪哪个软件在哪个主机上以及由谁负责的内部一致性。
主要的内脏挂断是字段名称到生成规则的映射。使用CSV和工厂似乎是我能想到的唯一选择,但只是唠叨我的东西,以某种方式所有这一切都可以更优雅地完成。任何人都可以帮我弄清楚,如果有更清洁,更容易扩展,我应该考虑的模式或其他结构吗?
也许有一点令人不安的是创建上面描述的CSV模板。一旦我定义了如何实现"设备ID"似乎每次我想制作另一个模板时,必须复制并粘贴它或重新键入它可能会变得很痛苦。那么,也许,我应该定义在公共文件中生成所有内容的规则,然后每个模板只提供字段名称。
答案 0 :(得分:1)
主要的内脏挂断是字段名称到生成的映射 规则
为什么不直接映射到规则类?你可以像这样描述你的领域(json):
[
{
"field": "text_description",
"rule": "MarkovChainGenerator",
"params": {
"source": "romeo_and_julliete.txt",
"degree": 11
}
},
{
"field": "salary",
"rule": "\\OtherNamespace\\SalaryGeneratory",
"params": {
"max": "1000.00"
}
}
]