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

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

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

到目前为止,使用脚本似乎是最灵活的方式,但仍然感觉有点笨拙。我必须足够多地执行此任务,以至于我什至考虑为其编写一些 DSL,以加快速度。

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

有帮助吗?

解决方案

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

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

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

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

是的,这是一项繁重的工作,但从长远来看,当有一个程序在 95% 的情况下都有效时,每个人都会获胜。

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

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

其他提示

是的..那太糟糕了。

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

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

有很好的 CSV 包可供使用 Python, 红宝石, , 和 珀尔.

DSL 是最佳选择。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top