!参考问题1
如图所示...我有一个 Excel 表,其中一个接一个地包含 32 个表(我在图像中取了 2 个表)可能会增加表数...但是所有表的元数据都是相同的。表有两列,一列是常量(名称),另一列会发生变化(TPA,TPB.. 等),但列位置没有变化。现在的问题是如何保存标题并作为 T_type 值插入到目标表中?
每个表中的行数不固定(所以我们不能去参考单元格)。
!参考问题1
如图所示...我有一个 Excel 表,其中一个接一个地包含 32 个表(我在图像中取了 2 个表)可能会增加表数...但是所有表的元数据都是相同的。表有两列,一列是常量(名称),另一列会发生变化(TPA,TPB.. 等),但列位置没有变化。现在的问题是如何保存标题并作为 T_type 值插入到目标表中?
每个表中的行数不固定(所以我们不能去参考单元格)。
我相信您在 Excel 中的数据看起来大约
Name | TPA
abc | x
...
Name | TPB
acz | p
数据可以描述为数据块。一个块由一个起始行定义,其中的值是Name
。该行的下一个单元格将包含一个适用于所有后续行的值。
在标题行之后,您需要提取键值对并将它们加上表名写入您的目的地。
元数据保持一致,只是源数据全部被banjaxed。
这正是我通过 SSIS 编写 SSIS Excel Source时必须克服的问题。我们必须从报告中获取我们的数据源,而不是从干净的表格数据中获取。使用这种方法,您只需定义等效ParseSample
方法,然后在 foreach 循环(ExcelParser 的第 71 行)中放入块逻辑中的所有内容都是从值为 'Name' 的字段直到遇到空的排。
伪码近似
# enumerate through all my source data
foreach row in source data
# assign values to local variables
col0 = row[0]
col1 = row[1]
# Test for end of block
if col0 == "Name"
tableName = col1
else if col0 == string.Empty
# do nothing
else
newRow = dataTable.NewRow()
newRow[0] = col0
newRow[1] = tableName
newRow[2] = col1
dataTable.Add(newRow)
如果你想简化事情,你可以在 ScriptMain 中拥有所有的解析逻辑,并省去所有数据表的废话。
好处是代码会更少,坏处是调试脚本是 SSIS 2012 之前的魔鬼。它在 2012 年仍然很笨拙,但总比之前的一无所有要好。