【发布时间】:2011-01-16 21:29:38
【问题描述】:
我有一个由计算机模拟生成的纵向数据集,可以用下表表示('var' 是变量):
time subject var1 var2 var3
t1 subjectA ...
t2 subjectB ...
和
subject name
subjectA nameA
subjectB nameB
但是,生成的文件会以类似于以下的格式写入数据文件:
time t1
description
subjectA nameA
var1 var2 var3
subjectB nameB
var1 var2 var3
time t2
description
subjectA nameA
var1 var2 var3
subjectB nameB
var1 var2 var3
...(and so on)
我一直在使用 (python) 脚本将此输出数据处理为纯文本文件,以便我可以将其导入 R、python、SQL 或 awk/grep 以提取信息 - 类型的示例单个查询所需的信息(在 SQL 表示法中,在数据转换为表之后)如下所示:
SELECT var1, var2, var3 FROM datatable WHERE subject='subjectB'
我想知道是否有更有效的解决方案,因为这些数据文件中的每一个都可能约为 100MB(我有数百个),并且创建纯文本文件非常耗时,并且会占用额外的硬盘空间和冗余信息。理想情况下,我会直接与原始数据集交互以提取我想要的信息,而无需创建额外的平面文本文件......对于此类任务是否有更简单的 awk/perl 解决方案?我非常精通 python 中的文本处理,但我的 awk 技能还很初级,而且我没有 perl 的工作知识;我想知道这些或其他特定领域的工具是否可以提供更好的解决方案。
谢谢!
后记: 哇,谢谢大家!对不起,我不能选择每个人的答案 @FM:谢谢。我的 Python 脚本类似于您的代码,但没有过滤步骤。但是你的组织是干净的。 @PP:我以为我已经精通 grep 但显然不是!这非常有帮助......但我认为将“时间”混合到输出中时,grepping 变得很困难(我未能在我的示例中将其作为可能的提取场景包括在内!那是我的错)。 @ghostdog74:这真是太棒了……但是修改该行以获得“subjectA”并不简单……(尽管同时我会阅读更多关于 awk 的内容,希望我稍后会摸索)。 @weismat:说得好。 @S.Lott:这非常优雅和灵活——我不是在要求 python(ic) 解决方案,但这完全符合 PP 建议的解析、过滤和输出框架,并且足够灵活,可以容纳许多不同的查询从这个分层文件中提取不同类型的信息。
再次感谢大家 - 非常感谢。
【问题讨论】:
标签: python perl awk text-processing flat-file