【问题标题】:What is the best file parsing solution for converting files?转换文件的最佳文件解析解决方案是什么?
【发布时间】:2009-12-09 22:04:38
【问题描述】:

我正在为我们的企业导入例程寻找自定义文件解析的最佳解决方案。我想基本上将一种文件格式更改为标准文件格式,并有一个将数据导入数据库的例程。我需要能够为每个客户创建自定义脚本,因为很难让客户遵守标准或模板格式。到目前为止,我已经查看了 PowerShell 和 Iron Python 来做到这一点,但我不确定这是我想要走的路。我还查看了一些工具,例如 Talend,它是一种拖放式工具,就灵活性而言,它可能会或可能不会给我想要的东西。我们是一家 .NET 商店,过去已经创建了自定义代码来执行此操作,但我需要在每次获得新文件格式时更快地创建然后编写自定义解析函数。

【问题讨论】:

    标签: powershell ironpython etl fileparsing


    【解决方案1】:

    根据您工作的复杂性和可变性,您应该考虑使用 ETL 工具,例如 SSIS(SQL Server 集成服务)。

    【讨论】:

    • 我们得到的一些文件很难解析。除了文件的标准导入之外,我们还可以使用 SSIS 附带的任何特殊工具吗?
    • 请提供有关格式的更多详细信息。通常,SSIS 将允许您解析几乎任何格式 - 固定字段、分隔、XML 等。如有必要,编写适合 SSIS 的自己的解析器相当容易,因此只需自定义解析函数。
    • 我没有意识到您可以在 SSIS 中使用自定义解析函数。我将不得不对此进行更多研究。谢谢!我正在考虑购买像 Advanced ETL Processor Ent 这样的工具。
    • 您可以为 SSIS 创建自定义组件 - 纯粹在代码中或在脚本组件中。在任何情况下,编写一个自定义的 Source Transform 来进行解析并将结果作为新的输出列返回。
    • 我同意约翰的观点——一定要看看 SSIS。这是 SQL Server 2005 或 2008 标准版或企业版附带的出色 ETL 工具。
    【解决方案2】:

    Python 非常适合这种事情。这就是我们使用的原因。每次新客户转移都是一次新的冒险,Python 为我们提供了快速响应的灵活性。


    编辑。所有读取文件的 python 脚本都是“自定义文件解析器”。没有实际的例子,提供详细的例子是不明智的。

    with open( "some file", "r" ) as source:
        for line in source:
            process( line )
    

    这就是“自定义文件解析器”的全部内容。如果您正在解析 .csv 或 .xml 文件,那么 Python 有相应的模块。如果您正在解析固定格式的文件,您将使用字符串切片操作。如果您要解析其他文件(X12?JSON?YAML?),您将需要适当的解析器。

    制表符分隔符

    from collections import namedtuple
    RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
    def process( aLine ):
        record = RecordLayout( aLine.split('\t') )
        ...
    

    固定布局

    from collections import namedtuple
    RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
    def process( aLine ):
        fields = ( aLine[:10], aLine[10:20], aLine[20:30], ... )
        record = RecordLayout( fields )
        ...
    

    【讨论】:

    • 你能给我看一个你用来做解析的示例脚本吗?我还没有找到任何显示自定义文件解析的好示例。
    • @Ryan:所有读取文件的 python 程序都是“自定义文件解析器”。你有内置的 XML、CSV、JSON、YAML 和其他一些解析器。您可以下载 XLS 电子表格的解析器。由于您的问题只是说“自定义”,因此尝试提供任何代码都是不明智的。您必须提供一个示例文件。
    • 有时我们输入的文件格式很奇怪,可能需要我们进行一些自定义解析才能从中获取我们想要的数据。它们大部分是制表符分隔的,但有时它们甚至不会使用 SSIS 使用制表符分隔设置加载。下面是我们现在如何使用 C# 对我们加载的文件之一进行导入解析的示例。字符串 lname = line.Substring(10, 20).Trim();字符串 fname = line.Substring(30, 10).Trim();字符串 mi = line.Substring(40, 1).Trim();