【问题标题】:special data loading logic in ssisssis 中的特殊数据加载逻辑
【发布时间】:2017-06-15 07:11:19
【问题描述】:

我有一个每天收到的转储文件,我想知道如何通过 ssis 和 sql server 数据库中的脚本任务加载它。转储的格式如下所述,来自

这些应该只有两个记录行,而在文件中我需要编写一个解析器,它可以实际缓冲数据并存储在列名 A B C D .... AC 中。字母是列名,= 之后的数据是需要存储在这些列中的实际数据 如果有人可以帮助我加载这些数据,我需要帮助。

<BEGIN
a=103216789021;
b=125230049;
c=TS1;
d=NON;
e=2;
d=TS1;
f=BC;
g=MIS;
H=100;
I=61005;
J=YES;
K=MC;
L=CW-ALL;
M=0;
N=CLIP;
O=ON;
P=1;
Q=90;
R=90;
S=90;
T=REE;
U=ALL;
V=0;
W=1382326697;
X=1382413166;
Y=01D81E170EE83C06;
Z=YES;
AB=NO;
AC=NO;
<END
<BEGIN
a=103216789021;
b=125230049;
c=TS1;
d=NON;
e=2;
d=TS1;
f=BC;
g=MIS;
H=100;
I=61005;
J=YES;
K=MC;
L=CW-ALL;
M=0;
N=CLIP;
O=ON;
P=1;
Q=90;
R=90;
S=90;
T=REE;
U=ALL;
V=0;
W=1382326697;
X=1382413166;
Y=01D81E170EE83C06;
Z=YES;
AB=NO;
AC=NO;
<END

【问题讨论】:

  • 到目前为止你尝试过什么?脚本任务很容易为您处理。
  • 我对编程不太适应,问题是我想编写 vb.net 文件解析代码,但我无法实现它的逻辑。对不起,我为此感到羞耻,因为我不知道。 :(
  • 不必害臊。我们都必须从某个地方开始 :) 尝试将事情分解成可管理的块。您的数据实际上看起来很容易使用。您总是(似乎)有预定义数量的列,并且它们的名称在文件中。它们后面总是跟一个 '=' 符号,并且在值之后,有一个很好的分号。尝试通过设置一个包含数据流和其中的脚本组件(转换)的 SSIS 任务开始。将其设置为具有 1 个输出列 (A),并查看您是否可以编写代码以将“A”的值从缓冲区输入中提取出来:)
  • 人!您不必编写所有代码!这只是一个完全正常的分隔文件,除了列分隔符是回车符和行分隔符是&lt;END
  • 我从没想过会这样,但现在我的包有了一个甜蜜的新花样......谢谢!!!

标签: sql sql-server ssis etl


【解决方案1】:

有一种方法可以在数据流中执行此操作。但这仍然需要一些编程知识。

您将首先编写一个脚本转换,该转换读取每一行并在每次遇到&lt;BEGIN 行时更新一个计数器。否则它不会传递&lt;BEGIN&lt;END 行。

然后它将在 = 符号上拆分传入行,并将计数器添加为 RowID 列,以便脚本转换的最终输出如下所示:

RowId   ColumnName   Value
1       a            103216789021
1       b            125230049
...and so on...
1       ac           NO
2       a            103216789021
2       b            125230049
...and so on...

然后,您使用 UNPIVOT 转换将 RowId 用于行,将 ColumnName 用于列名,将 Value 用于值。

【讨论】:

  • 感谢您的回复,但列中有重复,甚至列数也不相同。一条记录的列数可能是 10,其他的可能是 12。
  • 您必须在脚本转换中处理此问题,将两个 d 更改为 d1 和 d2。我不确定 UNPIVOT 是否会自动处理丢失的列。如果没有,您也必须在脚本中处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2018-11-08
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多