2010-10-07 112 views
1

我有一个名为Animals的表。我从该表中提取数据以填充另一个系统。导入/粘贴Excel数据并将字段更改为SQL表

我得到Excel数据和动物列表中需要进入动物表的动物。

Excel数据也会有其它标识符,如品种,肤色,年龄,最喜爱的玩具,兽医等

这些标识符将与每一个新的excel文件更改。有些人可能会重复,其他人是全新的。

由于字段发生变化,我永远不知道每个新的excel文件会出现哪些新字段,因此我的动物表只有动物标识和动物名称。

我创建了一个Values表来保存所有其他标识符字段。该表的结构是这样的:

AnimalId 
Value 
FieldId 
DataFileId 

然后我有持有价值表的关键在于每一个FieldId字段表。

我这样做是因为替代方法是在每次需要添加数据时都可能无法使用的字段中保留一个大表。一个有很多空列的大表。

我不确定我的方式是一种好方法。它看起来过于复杂。

但是,假设这是一个好方法,将这个excel数据存入我的Values表的最好方法是什么?动物列表很容易添加到我的动物表中。但是对于每个标识符(品种,颜色等),我必须复制或导入这些值,然后更新表以分配匹配的FieldId(或者如果它尚不存在,请在Fields表中创建一个新的FieldId)。

如果有很多标识符,加载新数据是一个巨大的痛苦。我真的很挣扎,可以使用更好的系统。

任何意见,帮助,或只是指着我在一个更好的方向将非常感激。

谢谢。

回答

0

根据您的客户(例如,我在Mac上使用SequelPro),您可能可以导入CSV。这通常很不稳定,但您也可以将Excel文档导出为CSV ...方便。

但是,这并没有真正帮助您的数据库结构。当然,使用外键是一个好主意,但是不显眼地(并且容易地)输入数据是需要一次一行地完成的。

但是,您可以尝试修改这样的内容以满足您的需求,方法是首先将您的Excel文档导出为CSV格式,移除标题行(第一行),然后使用正则表达式将其更改为大量的SQL。例如:

您的CSV:

myval1.1,myval1.2,myval1.3,myval1.4 
myval2.1,myval2.2,myval2.3,myval2.4 
... 

在这一点上,你可以这样做:

myCsvText.replace(/^(.+),(.+),(.+)$/mg, 'INSERT INTO table_name(col1, col2, col3) VALUES($1, $2, $3)') 

,你知道列,他们的名字的数量,以及如何它们的值(通过正则表达式&替换)。

可能是一个很好的开始。

0

您的表格看起来不错。由于您的字段数量可变,因此垂直扩展似乎合乎逻辑。尽管您可能希望通过将DataFileID和FieldID更改为FieldName和DataFileName来让自己更容易,除非您也将其用于很多其他表中。

不幸的是,从Excel中获取数据到SQL Server中并不像从两个Microsoft产品与其他人互相交流那样容易。有几条路线我知道你可以采用:

  1. 使用CSV文件而不是Excel文件。 Excel可以像Excel文件一样轻松地编辑CSV文件,但在导入时,CSV是无限可靠的数据源。对于不同的Excel版本,您不会遇到不同文件格式的问题,Excel必须安装在运行脚本的计算机上,或者具有自动数据类型识别的怪癖。可以使用BCP命令行工具,BULK INSERT命令或SSIS读取CSV。然后使用存储过程将水平大量列中的数据转换为纯粹的垂直格式。

  2. 使用SSIS直接从Excel文件读取数据。可以创建一个循环遍历多个Excel文件的包。缺点是事先必须知道Excel文件的列格式和表格名称,因此每次新的Excel格式到达时都必须创建一个不同的模板(带有单独的循环)。有第三方SSIS组件声称更灵活,但我还没有测试过它们。

  3. 编写抓取Excel文件的Visual C#程序或PowerShell脚本,提取数据并将其输出到SQL表中。 Visual C#是一种非常简单的语言,具有强大的Office和SQL Server接口。我不知道学习曲线开始有多大,但一旦完成,这将是一个非常容易编写的程序。我也听说过good things about Powershell

  4. 创建一个Excel宏,该宏使用VB代码打开其他Excel文件,遍历数据并将结果写入预定义工作表或将CSV写入磁盘。一旦一切都处于标准格式,使用上述方法之一就可以轻松导入数据。

因为我有1)和2)以前的头痛,我会建议3)或4)。由于我在VBA方面的经验比Visual C#或PowerShell有更多的经验,如果我很着急的话,我会去做4)。但我认为3)长期来看是更好的投资。

(你也可以去冒险和使用其他的脚本语言,如Python,因为我曾经做过,因为Python是很酷,可惜的是python提供相当缓慢和有限的接口到SQL Server和Excel)

祝你好运!