【问题标题】:How do you go about batch processing poorly formatted text files?如何批量处理格式不佳的文本文件?
【发布时间】:2010-11-30 16:33:24
【问题描述】:

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

话虽如此,我很好奇其他程序员如何自动解析格式不佳的文本文件。你有语言偏好吗?是否有任何您认为非常宝贵的自动化工具?你如何让你的代码可重用?

【问题讨论】:

    标签: parsing


    【解决方案1】:

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

    以下是ocamllex 的一些示例(OCaml 提供的词法分析器生成器):

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

    如果使用 OCaml 对您来说是个问题,显然词法分析器生成器也可用于其他语言。

    【讨论】:

      【解决方案2】:

      Perl / Python,慢慢地构建功能,把最差的作为测试用例,大量的咖啡

      【讨论】:

        【解决方案3】:

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

        pattern_name ::= pattern_symbol1 pattern_symbol2 ... 
        

        或者对于词位模式,

        lexeme ~ lexeme_symbol1 lexeme_symbol2 ... 
        

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

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

        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>
        

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          我知道我会为此收到严厉的回应,但我喜欢 Java 作为一种全能语言。在文件解析的情况下,通用正则表达式(我知道,现在我有 2 个问题......)对我来说效果很好。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-16
            • 1970-01-01
            • 2013-11-04
            • 1970-01-01
            • 2013-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多