通过将字段更改为SQL表来导入/粘贴Excel数据

时间:2010-10-07 20:18:43

标签: sql sql-server excel

我有一张叫做动物的桌子。我从此表中提取数据以填充另一个系统。

我获得的Excel数据包含需要进入动物表的动物列表。

Excel数据还有其他标识符,如Breed,Color,Age,Favorite Toy,Veterinarian等。

这些标识符将随每个新的Excel文件而变化。有些可能会重复,有些则是全新的。

因为字段发生了变化,而且我永远不知道每个新的excel文件会带来什么新字段,所以我的Animals表只有动物ID和动物名称。

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

AnimalId
Value
FieldId
DataFileId

然后我有一个Fields表,它包含Values表中每个FieldId的键。

我这样做是因为另一种方法是保留一个包含每次需要添加数据时都不会使用的字段的大表。一个包含大量空列的大表。

我也不确定自己的方式是好方法。它看起来过于复杂。

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

如果有很多标识符,加载新数据会非常痛苦。我真的很挣扎,可以使用更好的系统。

任何建议,帮助,或者只是指向一个更好的方向,都会非常感激。

感谢。

2 个答案:

答案 0 :(得分: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)')

您可以知道列数,名称以及值的组织方式(通过正则表达式和替换)。

可能是个好地方。

答案 1 :(得分: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. 编写一个Visual C#程序或PowerShell脚本,用于获取Excel文件,将数据和输出提取到SQL表中。 Visual C#是一种非常简单的语言,具有强大的Office和SQL Server接口。我不知道开始学习曲线有多大,但一旦你这样做,这将是一个非常容易编写的程序。我也听过good things about Powershell

  4. 创建一个Excel宏,它使用VB代码打开其他Excel文件,循环访问其数据并将结果写入预定义的工作表或CSV写入磁盘。一旦所有内容都采用标准格式,就可以使用上述方法之一轻松导入数据。

  5. 由于我曾经有过1)和2)的头痛,我会建议3)或4)。由于我对VBA的经验比Visual C#或Powershell更好,如果我赶时间,我会去4)。但我认为3)从长远来看是更好的投资。

    (你也可以去冒险并使用其他脚本语言,比如我曾经做过的Python,因为Python很酷,不幸的是Python提供了非常慢且有限的SQL服务器和Excel接口)

    祝你好运!