【问题标题】:ssis 2012 load flat file with different sized recordsssis 2012 加载具有不同大小记录的平面文件
【发布时间】:2018-04-13 18:18:35
【问题描述】:

我刚刚开始使用 SSIS,并且已经处理了以下问题:

我有一个从 VMS 应用程序导出的主/详细(各种)平面文件(重新格式化文件或以不同方式提供输出的可能性为零)。文件内容是按位置定义的(谢天谢地,我有文件定义可以使用),就像这样

HD01 - Header record - 82 positions, 12 columns
IN01 - Invoice header - 438 positions, 54 columns
IN02 - Credit Note header - 438 positions, 33 columns
IN03 - Invoice detail - 507 positions, 41 columns
IN04 - Credit detail - 164 positions, 46 columns

HD01 仅在文件顶部出现一次,而 IN01 - IN04 出现多次。

我可以使用平面文件源连接加载数据文件,但我需要将所有记录类型加载到它们各自的目标表中。我能做的最好的事情是读取文件,并将每种记录类型的内容放入一个暂存表中,其中每个表有 2 列:记录类型(HD01、IN01 等),其余的来自数据文件的相应行,但是从数据文件到表格的字符转换会导致奇数字符(即:日期应该是黑色块)。

我想我的问题有两个: 1 - 如何使用我知道的数据格式将源数据文件正确拆分为 5 个目标表? 2 - 我的角色翻译怎么了?

【问题讨论】:

  • 是否也可以提供一些数据?你会收到 IN01 类型的每一行的前缀吗?
  • 不能提供样本数据(高度专有),但是每个前缀出现在每一行,所以任何一行的前 4 个字符将是它的记录类型
  • 您是否尝试过使用平面文件源读取文件并提取派生 col 中的前 4 个字符,然后使用条件拆分将记录发送到 5 个目标?
  • 正如我所提到的,我可以为每种记录类型获取一个 2 列表:Col_1 是记录类型,Col_2 是在线上的所有其他内容。我遇到的问题是如何将 Col_2 拆分为记录定义的其余部分?

标签: sql ssis


【解决方案1】:

1 - 如何将源数据文件拆分为 5 个目标表 正确地使用我知道的数据格式?

我相信,在这种情况下,如果输出格式或多或少是固定的,则将行解析为单独的值并将数据加载到临时表中是一种方法。

例如:

DECLARE @Table1 TABLE (line varchar(255));

INSERT INTO @Table1 VALUES 
( 'HD01 - Header record - 82 positions, 12 columns'),
( 'IN01 - Invoice header - 438 positions, 54 columns'),
( 'IN02 - Credit Note header - 438 positions, 33 columns'),
( 'IN03 - Invoice detail - 507 positions, 41 columns'),
( 'IN04 - Credit detail - 164 positions, 46 columns')

SELECT LEFT(line,4) AS LineTypeCoded
, SUBSTRING(line, 8, CHARINDEX('-', line, 10)-8)  AS LineTypeDescription
, SUBSTRING(line, 2+CHARINDEX('-', line, CHARINDEX('-', line)+1), CHARINDEX('position', line) - 2-CHARINDEX('-', line, CHARINDEX('-', line)+1)) AS Positions
, LTRIM(REPLACE(REPLACE(SUBSTRING(line, CHARINDEX(',', line, CHARINDEX('position', line))+1, 100), 'column', ''), 's', '')) AS Columns
,line AS EntireLine
FROM @Table1

或更优雅的方式:

SELECT 
    PARSENAME(calc.line1, 4) AS LineTypeCoded
,   PARSENAME(calc.line1, 3) AS LineTypeDescription
,   PARSENAME(calc.line1, 2) AS  Positions
,   PARSENAME(calc.line1, 1) AS  PositionsColumns
,   line1 AS EntireLine
FROM @Table1
CROSS APPLY (
    SELECT REPLACE(REPLACE(REPLACE(REPLACE(line, ' - ', '.'),', ', '.'), 'columns', ''), 'positions', '') AS line1
    ) calc

所以最终的结果是这样的:

当数据被解析并在一个临时表中将行分配到 5 个不同的表中是一项微不足道的任务

2 - 我的字符翻译发生了什么?

它看起来像您的代码页问题。数据库的排序规则要与文件代码页匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多