您通常如何将数据从电子表格导入多个数据库列?

时间:2008-12-24 04:58:08

标签: database excel scripting utilities

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

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

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

到目前为止,使用脚本一直是最灵活的方式,但它仍然感觉有点笨重。我必须完成这项任务,我甚至打算为它写一点DSL,只是为了加快速度。

但在我这样做之前,我很好奇,有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

如果可以的话,你必须设置边界。您应该尝试为它们提供一个模板,以便与期望的数据一起使用,包括文件类型(Excel,csv等),列名,有效值等。您应该允许用于浏览文件并上传它在您的页面/表单上。

上传文件后,您需要进行验证和导入。您可以使用ADO.NET,文件流,DTS / SSIS或Office Automation来执行此操作(如果您使用的是Microsoft堆栈)。在验证部分,您应该告诉用户完全他们做错了什么或需要更改。这可能包括让验证页面在数据网格中包含实际数据,并在确切的行/列上提供错误的红色标签。如果您使用Office Automation,您可以给他们确切的单元格编号,但Office PIA是一个痛苦的问题。

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

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

是的,这是很多工作,但是在长期错误的情况下,当有一个程序在95%的时间内都有效时,每个人都会赢。

如果这是一个无法实现自动化的情况,那么您可能只需拥有一个vanilla staging表并使用sql进行导入。您必须将数据加载到一个临时表中,执行基本操作,然后将其加载到SQL预期的临时表中。

我已经完成了很多导入和ETL工具,实际上没有简单的方法来处理它。唯一的方法是真正提出一个合理的标准并坚持下去并围绕它进行编程。

答案 1 :(得分:2)

是的......那太糟糕了。

我会选择脚本。我假设你有重复的列必须匹配另一个表中的一行。我会做一个合理的匹配,如果你遇到一个脚本无法处理的行并移动数据...然后记录它并让别人手动完成。

答案 2 :(得分:2)

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

PythonRubyPerl提供了很好的CSV包。

答案 3 :(得分:0)

DSL是最佳选择。

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

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

您可以在Excel中提供DSL。这可以让你的智慧用户做(部分)映射。