【问题标题】:How do you typically import data from a spreadsheet to multiple database columns?您通常如何将数据从电子表格导入到多个数据库列?
【发布时间】:2010-09-28 07:03:26
【问题描述】:

无论出于何种原因,我的很多客户都有存储在电子表格中的现有数据。每个电子表格中通常有数百甚至数千个项目,并且要求客户通过网站手动输入它们(或者天堂禁止我自己以这种方式导入它们)是不可能的。通常,此数据不会简单地将电子表格列映射到数据库列。那太简单了。通常,数据需要在进入数据库之前进行操作(数据需要用逗号分隔等),或者数据需要分布在多个表中。或两者兼而有之。

我问这个问题,不是因为我不知道有多种方法可以做到这一点,而是因为我还没有找到一种不会觉得需要做更多工作的方法。到目前为止,我已经采用了以下所有方法(可能还有更多我已经忘记的方法):

  • 使用Excel修改数据,导入更方便
  • 将整个电子表格导入临时表,然后使用 SQL 导入
  • 编写脚本并使用它导入数据(我使用过 VBScript、C#,现在使用 Ruby)

到目前为止,使用脚本似乎是最灵活的方式,但还是有点笨拙。我必须完成这项任务,以至于我什至考虑为它编写一点 DSL,只是为了加快速度。

但在此之前,我很好奇,有没有更好的方法?

【问题讨论】:

    标签: database excel scripting utilities


    【解决方案1】:

    如果可以的话,你必须设定界限。您应该尝试提供一个模板供他们使用预期数据,其中包括文件类型(Excel、csv 等)、列名、有效值等。您应该允许用户浏览并上传文件在您的页面/表单上。

    文件上传后,您需要进行验证和导入。您可以使用 ADO.NET、文件流、DTS/SSIS 或 Office 自动化来执行此操作(如果您使用的是 Microsoft 堆栈)。在验证部分,您应该确切地告诉用户他们做错了什么或需要更改。这可能包括让验证页面在数据网格中包含实际数据,并在确切的行/列上提供带有错误的红色标签。如果您使用 Office 自动化,您可以为他们提供准确的手机号码,但 Office PIA 令人头疼。

    一旦验证被接受,您可以随意导入信息。我更喜欢将它放入临时表并使用存储的过程来加载它,但这只是我。有些人更喜欢使用对象模型,但如果您有大量数据,这可能会非常慢。

    如果您亲自手动加载这些文件并且不得不进入并操作它们,我建议您找到它们之间的共同点并提出一个可以遵循的标准。一旦你有了它,你就可以让它让用户可以自己做,或者你可以自己做的更快。

    是的,这需要做很多工作,但从长远来看,当有一个程序在 95% 的情况下都有效时,每个人都会赢。

    如果这将是一种无法自动化的情况,那么您可能只需要拥有一个普通的临时表并使用 sql 来进行导入。您必须将数据加载到一个暂存表中,进行基本操作,然后将其加载到您的 SQL 期望的测试暂存表中。

    我做了这么多的导入和 ETL 工具,真的没有简单的方法来处理它。唯一的方法是真正想出一个合理的标准并坚持下去并围绕它进行规划。

    【讨论】:

    • 如果导入频繁发生,大多数客户都非常愿意遵循标准。导入数据时最大的问题是只需要导入一次(在网站启动之前或添加新功能时等)。
    • 这对我来说似乎很重要。那些时候我们讨厌我们的工作。
    • 我过去曾为此使用过 MSSQL 的 DTS,并且效果很好。您应该让 DTS 包写入数据库中的日志,以便知道它何时成功或失败。
    【解决方案2】:

    是的..这太糟糕了。

    我会选择剧本。而且我假设您有重复的列必须匹配另一个表中的单行。我会进行合理的匹配,如果您遇到脚本无法处理的行并移动数据...然后记录它并让某人手动执行。

    【讨论】:

    • 我确实有像你描述的那样重复的列,合理的匹配几乎就是我告诉客户我能做到的。通常,如果他们不能提供某种唯一的 id 来匹配,他们就会明白事情并不总是完美匹配。
    【解决方案3】:

    当然,这是一些小细节会让你丧命,但总的来说,我已经成功地将数据从 Excel 导出为 CSV,然后使用 rool 或脚本读取它,根据需要对其进行修改,并插入它。根据我的环境的美妙程度,这可以通过脚本语言的数据库接口来完成,包括将 SQL INSERT 语句写入脚本文件。

    PythonRubyPerl 有很好的 CSV 包。

    【讨论】:

    • Ruby 实际上有一个名为(奇怪的是)电子表格的库,它也可以很好地直接从 Excel 导入。我在使用 ParseExcel 库(我认为这是一个 Perl 端口)时遇到了问题,但是电子表格是基于 ParseExcel 构建的,并且似乎已经解决了很多问题。
    【解决方案4】:

    DSL 是要走的路。

    为您的问题创建一个域模型。您谈论单元格、列、行、数据库表、拆分字段、组合字段、从单元格到数据库列的映射,这些都是您需要的概念。此外,您可能还需要范围(单元格)和表格。

    简单视图仅查看电子表格中的值,而不查看基础公式。将电子表格导出为制表符分隔的文本使您可以访问它。如果您需要访问公式,最好使用 xml 表示形式,XML 电子表格或 Office XML 格式。

    您也许可以在 Excel 中提出 DSL。这可以让您更聪明的用户进行(部分)映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2014-03-11
      相关资源
      最近更新 更多