【发布时间】:2009-11-08 22:42:36
【问题描述】:
我有一个可执行文件,其输入包含在 ASCII 文件中,格式为:
$ GENERAL INPUTS
$ PARAM1 = 123.456
PARAM2=456,789,101112
PARAM3(1)=123,456,789
PARAM4 =
1234,5678,91011E2
PARAM5(1,2)='STRING','STRING2'
$ NEW INSTANCE
NEW(1)=.TRUE.
PAR1=123
[More data here]
$ NEW INSTANCE
NEW(2)=.TRUE.
[etcetera]
换句话说,一些通用输入和一些新实例的一些参数值。参数声明不规范;有的数字用逗号隔开,有的用科学计数法,有的用引号括起来,间距不固定,等等。
某些场景的评估需要我输入一个“主”数据文件并将实例 2 到 6 的参数数据复制到另一个可能已经包含所述实例数据的数据文件(在这种情况下数据应该被覆盖)和可能的其他数据(应该保持不变的数据)。
我写了一个 Flex 词法分析器和一个 Bison 解析器;他们可以一起吃一个数据文件并将参数存储在内存中。如果我使用它们打开两个文件(主文件和“场景”),那么有选择地向第三个新文件写入所需参数(如"general input from 'scenario'; instances 1 though 5 from 'master'; instances 6 through 9 from 'scenario'; ..."),保存并删除原始场景应该不会太难文件。
其他信息: (1) 文件高度敏感,完全屏蔽用户更改主文件非常重要; (2) 文件大小可控(从 500K 到 10M)。
我知道我可以用十行代码完成,这里的一些人可以用两行代码完成。你会如何处理这个问题?一个 Pythonic 的答案会让我哭泣。认真的。
【问题讨论】:
-
这是一个很难回答的问题。您提到您已经构建了一个 flex 和 bison 解决方案,所以我不确定您还需要完成哪些部分?此外,您的条款太模糊,无法掌握。例如,什么标识了一个实例?
-
我可以对 Flex/Bison 解决方案感到满意,但有些人会发现很难维护 - 很少有人知道或对这些感到满意。这个问题在概念上并不难,我的解决方案,尽管我花了大约三个小时才完成,但似乎是“矫枉过正”。如果我能找到一个 Python 解决方案(@Alex Martelli - 感谢您的输入),人们会对我弄乱这些文件感到更加自在。实例是航天器轨迹中的新“腿”,具有相关参数,但我认为细节并不重要。
标签: python parsing text-files bison flex-lexer