你如何批处理格式错误的文本文件?

时间:2010-11-30 16:33:25

标签: parsing

人们抱怨XML很多但是,与我在职业生涯中处理过的EDI和一些专有文件格式相比,我认为XML是幸福的。我从汽车比较评估器导入数据文件所做的工作,每个都有自己的创意和噩梦文件格式,仍然让我做噩梦。

话虽如此,我很好奇其他程序员如何处理格式不正确的文本文件的自动解析。你有语言偏好吗?您觉得有什么自动化工具非常宝贵吗?如何使您的代码可重用?

4 个答案:

答案 0 :(得分:2)

我最近了解到的解决方案是使用独立的词法分析器。您可以使用结构化的正则表达式,并避免使用完整的解析器生成器的约束。

以下是ocamllex(lexer生成器随OCaml提供)的一些示例:

  • 一个带有一些例子的ocamllex tutorial
  • 处理genbank格式松散的文本文件(其他link更能说明这一点,但受到javascript对话框的阻碍)。

如果使用OCaml是一个问题,显然lexer生成器也可以使用其他语言。

答案 1 :(得分:1)

Perl / Python,慢慢构建功能,将更糟糕的功能作为测试用例,大量咖啡

答案 2 :(得分:1)

当我需要解析格式不正确的文本时,我使用Perl和Marpageneral BNF parser。查看文本,查找模式,将其描述为BNF规则,例如:

pattern_name ::= pattern_symbol1 pattern_symbol2 ... 

或lexeme模式,

lexeme ~ lexeme_symbol1 lexeme_symbol2 ... 

您可以使用单引号字符串和字符类来描述BNF语法文本中的词位。将BNF输入Marpa,定义语义动作并评估解析或仅处理ast以获得结果。

使用Marpa在SO上解析格式不佳的文本的Perl脚本示例:

Parse values from a block of text based on specific keys

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.

Parsing of parenthesis with sed using regex

key1
key2
key3
key4
key5
key6
key7

中提取
dummy
(key1)
(key2)dummy(key3)
dummy(key4)dummy
dummy(key5)dummy))))dummy
dummy(key6)dummy))(key7)dummy))))

How to extract corporate bonds informations using machine learning

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个问题......)对我来说效果很好。