SSIS - 导入变量格式文本文件

时间:2009-10-16 12:55:55

标签: .net sql-server sql-server-2008 ssis

“变量格式”是指文本文件中的每一行都以表示记录类型的单个字符代码开头,每种记录类型都有不同的格式。我相信这是一种相当常见的大型机数据导出方法。更糟糕的是记录类型实际上是层次结构。使用的代码如下:

0ThisIsAFileHeader
2ThisIsABatchHeader
4ThisIsDetailData
4ThisIsDetailData
6ThisIsAMatchingBatchFooter
8ThisIsAMatchingFileFooter

0/8是标题/预告片记录(每种格式),2/6是子标题/子预告片记录(也是各自的格式),4表示实际数据或详细记录。 / p>

SQL Server 2008,Visual Studio.NET 2008.自定义脚本任务是导入此数据的唯一方法吗?鉴于此,有人能指出我讨论这样做的资源吗?导入固定宽度的文本文件非常简单,但我不确定脚本任务在控制流中的位置以及后续步骤如何使用数据。

4 个答案:

答案 0 :(得分:4)

这可以在SSIS内完成,尽管你必须跳过几个圈。这是一种方法:

  • 源文件应设置为2列,第1个字符和其余字符串。
  • 基于第一个字符的条件拆分操作,将行拆分为单独的工作流程。
  • 采用第二列并将其拆分为相应字段的数据转换操作,必须分别对每种类型的行执行此操作,并将其附加到相应的条件拆分行。
  • 应为每个条件分支配置目标以适当地存储/处理数据。

如果需要进一步的ETL工作来开始将项目链接在一起,我会将文件导入临时表或永久暂存区域,并在提交最终结果之前执行更多转换。

真正的麻烦是数据是相关的,以及你如何保持这种关系/之后推断它。我想如果我必须把它放在一起,我会在数据流中使用一个脚本组件,每次看到一个标题记录时都会增加一个计数器,并输出到流中。这样每条记录都会有一个识别号码,可以用来将它们关联起来。

这有点复杂,但问题可以解决。

答案 1 :(得分:1)

也许SSIS有更好的方法来做到这一点,但是当我几年前在DTS中完成这项任务时,这就是我所做的。

首先,我将数据带入了具有两列的登台表(如果我觉得我需要一个自动生成的ID,则为三列)。一列用于表示记录类型的字符,一列用于该行的所有其余数据。

然后我根据在整个过程中进行任何清理的数据分离出规范化的表格。

然后我导入了我的生产表。

答案 2 :(得分:1)

如果我是你,那6个不同的字符代码是唯一与特定数据集相关的代码,那么我将使用平面文件导入组件导入它,然后在每个代码上使用Case组件进行切换。我假设您希望维护层次结构,以便您可以使用Case分割数据并随后将其插入。

使用脚本组件导入数据通常是我的最后手段,但我确实喜欢在文件(如您的情况下)无法正确导入时使用脚本代码在实际平面文件导入之前格式化数据。我相信编写一个格式化应用程序并使用它来格式化来自系统的任何文件比每次编写自定义脚本导入更有用。

答案 3 :(得分:1)

我做过很多次这样的事情,但我总是预先处理数据,为每一行添加一个行号。之后,使用max / min和行号的比较很容易将表连接到自身,以便将这些部分保持在一起。

但那有点笨拙。如果我们使用条件拆分,SSIS本身可以得到一个行号吗?或者我们可以使用递增的整数键来代替行号,而没有条件会使它们无序的风险吗?