你通常如何将电子表格中的数据导入到多个数据库列中?

6
出于某种原因,我有很多客户的现有数据存储在电子表格中。通常每个电子表格中都有数百个甚至数千个项目,要求客户通过网站手动输入(或者更糟糕的是让我导入)是不可行的。通常,这些数据不能简单地将电子表格列映射到数据库列。那太容易了。经常需要在进入数据库之前操作数据(数据需要用逗号分隔等),或者数据需要分散到多个表中。或者两者都有。
我提出这个问题,并不是因为我不知道有很多方法可以做到这一点,而是因为我还没有找到一种感觉不像应该花费更多工作量的方法。到目前为止,我已经采用了以下所有方法(可能还有我忘记的其他方法):
- 使用Excel修改数据,使其更容易导入 - 将整个电子表格导入临时表,然后使用SQL导入 - 编写脚本并使用它导入数据(我使用过VBScript、C#和Ruby)
到目前为止,使用脚本似乎是最灵活的方式,但仍然感觉有些笨重。我必须执行这个任务足够多次,以至于我甚至考虑编写一个小DSL来加快速度。
但在我这样做之前,我想知道,有没有更好的方法?
4个回答

2

是啊,那太糟糕了。

我会选择脚本。我假设您有需要匹配其他表中的单行的重复列。我会进行合理的匹配,如果遇到脚本无法处理的行并移动数据...然后记录它并让某人手动处理。


我确实有像你描述的重复列,合理的匹配基本上就是我告诉客户我能做到的。通常,如果他们无法提供某种唯一标识来进行匹配,他们会理解事情并不总是完美匹配的。 - Matt Ephraim

2
当然,细节会让你陷入困境,但总的来说,我从Excel导出数据为CSV格式,然后使用工具或脚本读取它,根据需要进行数据处理并插入到数据库中。根据我的环境好坏不同,可以使用数据库接口到脚本语言,甚至将SQL INSERT语句写入脚本文件中。对于Python、Ruby和Perl,都有可用的CSV包。请参考以下链接:PythonRubyPerl

Ruby实际上有一个叫做(非常奇怪的)Spreadsheet库,它在直接从Excel导入方面工作得非常好。我曾经遇到过ParseExcel库的问题(我认为这是一个Perl移植库),但Spreadsheet基于ParseExcel构建,并且似乎已经解决了很多问题。 - Matt Ephraim

2
如果可以的话,您需要设定边界。您应该尝试并提供一个模板,其中包括文件类型(Excel、csv等)、列名、有效值等预期数据。您应该允许用户浏览文件并在您的页面/表单上上传它。
一旦文件上传完成,您需要进行验证和导入。您可以使用ADO.NET、文件流、DTS/SSIS或Office Automation来实现此目的(如果您正在使用Microsoft堆栈)。在验证部分,您应该告诉用户确切地做错了什么或需要更改什么。这可能包括使验证页面具有数据网格和提供带有错误的红色标签的确切行/列。如果使用Office Automation,则可以向他们提供确切的单元格编号,但Office PIA很麻烦。
一旦验证被接受,您可以按任何喜欢的方式导入信息。我更喜欢将其放入暂存表中,并使用存储过程进行加载,但这只是我的偏好。有些人喜欢使用对象模型,但如果您有大量数据,这可能会非常缓慢。
如果您正在手动加载这些文件并必须进入并操作它们,则建议找到它们之间的共同点并制定一个要遵循的标准。一旦您拥有了这个标准,您可以使用户自己处理它,或者您可以更快地自己处理它。
是的,这是很多工作,但从长远来看,当有一个95%的有效程序时,每个人都会受益。
如果这将是一个无法自动化的情况,那么您可能只需要拥有一个普通的暂存表,并具有用于导入的sql。您将不得不将数据加载到一个暂存表中,进行基本操作,然后将其加载到SQL所期望的暂存表中。
我做过很多导入和ETL工具,真正处理它们的方法并不容易。唯一的方法就是制定一个合理的标准并坚持它,并围绕它进行编程。

大多数客户在频繁进行导入时都会遵循标准,这一点做得相当不错。最大的问题出现在只需要导入一次数据的情况下(例如在网站上线之前或添加新功能时等)。 - Matt Ephraim
这对我来说似乎是个例外。这些时候我们讨厌我们的工作。 - Charles Graham
过去我曾经使用 MSSQL 的 DTS 来完成这个任务,而且一直表现良好。你应该让 DTS 包将执行过程写入数据库日志,以便知道它何时成功或失败。 - Diodeus - James MacFarlane

0

DSL 是最好的选择。

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

简单视图仅查看电子表格中的值,而不是底层公式。将电子表格导出为制表符分隔的文本可让您访问该文本。如果您需要访问公式,则最好使用 XML 表示形式,无论是 XML 电子表格还是 Office XML 格式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接