人们抱怨XML很多但是,与我在职业生涯中处理过的EDI和一些专有文件格式相比,我认为XML是幸福的。我从汽车比较评估器导入数据文件所做的工作,每个都有自己的创意和噩梦文件格式,仍然让我做噩梦。
话虽如此,我很好奇其他程序员如何处理格式不正确的文本文件的自动解析。你有语言偏好吗?您觉得有什么自动化工具非常宝贵吗?如何使您的代码可重用?
答案 0 :(得分:2)
我最近了解到的解决方案是使用独立的词法分析器。您可以使用结构化的正则表达式,并避免使用完整的解析器生成器的约束。
以下是ocamllex(lexer生成器随OCaml提供)的一些示例:
如果使用OCaml是一个问题,显然lexer生成器也可以使用其他语言。
答案 1 :(得分:1)
Perl / Python,慢慢构建功能,将更糟糕的功能作为测试用例,大量咖啡
答案 2 :(得分:1)
当我需要解析格式不正确的文本时,我使用Perl和Marpa,general BNF parser。查看文本,查找模式,将其描述为BNF规则,例如:
pattern_name ::= pattern_symbol1 pattern_symbol2 ...
或lexeme模式,
lexeme ~ lexeme_symbol1 lexeme_symbol2 ...
您可以使用单引号字符串和字符类来描述BNF语法文本中的词位。将BNF输入Marpa,定义语义动作并评估解析或仅处理ast以获得结果。
使用Marpa在SO上解析格式不佳的文本的Perl脚本示例:
Problem Category = "Human Endeavors "
Problem Subcategory = "Space Exploration"
Problem Type = "Failure to Launch"
Software Version = "9.8.77.omni.3"
Problem Details = "Issue with signal barrier chamber."
摘自:
Problem Category: Human Endeavors Problem Subcategory: Space ExplorationProblem Type: Failure to LaunchSoftware Version: 9.8.77.omni.3Problem Details: Issue with signal barrier chamber.
key1
key2
key3
key4
key5
key6
key7
从
中提取dummy
(key1)
(key2)dummy(key3)
dummy(key4)dummy
dummy(key5)dummy))))dummy
dummy(key6)dummy))(key7)dummy))))
ABC 2.5 19
XYZ 6.5 15
从
中提取<[/] Trading 10mm ABC 2.5 19 05/06 mkt can use 50mm>
<XYZ 6.5 15 10-2B 106-107 B3 AAA- 1.646MM 2x2>
希望这有帮助。
答案 3 :(得分:0)
我知道我会收到严厉的回复,但我喜欢Java作为一种全能的语言。在文件解析的情况下,通用正则表达式(我知道,现在我有2个问题......)对我来说效果很好。