在UNIX上,我必须通过各种命令行实用程序从以前的数据中生成数值结果。这些实用程序读取起始数据(通常,但不仅仅是来自csv文件),执行计算和写入数据(一般情况下,但不仅仅是csv文件)。
当然,我不想冒风险过时的派生数据,所以我需要通过实用程序链接数据依赖。通过电子表格可以看到微不足道的相似性:当您更改单元格时,所有其他相关单元格也会以级联方式发生变化。但是,由于我的任务更加复杂和自动化,我无法使用电子表格。
现在,你可以拥有的第一个想法是使用make,这是我已经体验过的东西。这是微不足道的,很适合这项任务。但是,您依赖于文件,因此如果您依赖于存储在数据库中的某些数据,则必须欺骗系统。我也知道biomake,但据我记得是在prolog中制作的,我不想冒险穿越这条道路。
在冒险编写makefile路径之前,我对您的其他输入感兴趣。 你们有没有关于如何进行这种数据处理,比make更好的实用程序以及如何组织文件布局(数据和makefile)的好建议?
答案 0 :(得分:1)
答案 1 :(得分:1)
答案 2 :(得分:1)
Rake是面向依赖项编程的Ruby实现,受到Make和Ant的启发,但很多更清洁,更好用。
最近,现场出现了一个名为Tap的新人。它还允许面向依赖性编程,但使用工作流程等概念进行扩展。它由一位在生物分子研究实验室工作的博士生物化学专业学生设计,专门完成你提到的事情:保持实验的科学数据是最新的。
答案 3 :(得分:1)
假设有可能发现数据库记录较新,那么应该可以编写一个程序,将sentinel文件的日期设置为最新数据记录的日期(或“now”,如果是更简单)在相关的源表中。对每个数据库或查询执行此操作将为您提供一组Sentinel文件,这些文件可与现有CSV源文件一起使用,以提供依赖关系树并使用标准make驱动整个计算。
在每次构建时更新标记的一个简单方法是使用运行数据代理生成器的构建脚本,然后使用make代替make命令本身。
应该可以安排make自动更新标记作为正常依赖性检查的一部分。类似下面的内容(未经测试)应该可以解决问题:
all: result
clean:
-rm table_*.txt
-rm step*.csv
-rm results.txt
results.txt: step2.csv
write_report -o results.txt step2.csv
step1.csv: source.csv table_A.txt
do_step1 -o step1.csv source.csv
step2.csv: step1.csv table_B.txt
do_step2 -o step2.csv
table_A.txt:
touch_sentinel -o table_A.txt rawdata.sqlite A
table_B.txt:
touch_sentinel -o table_B.txt otherdata.sqlite B
其中touch_sentinel
创建自数据库中表的最新更新以来的输出文件。确定如何学习日期是读者的一项练习......