我有一个带有列分隔符的文本文件为| (管道)和行分隔符为CRLF(新行字符)。输出是一个SQL表。 如果我的文件中的数据有更多管道(|)或更多CRLF字符,那么我的连接管理器如下所示: -
文件中的数据。格式正确。然后表中的输出是正确的。
[Global Unique Identifier]|[KPI Name]|[KPI Description]|[Process Impacted]|
[Objective]|[Strategy ID]|[KPI Category]|[KPI Measure Type]
A26|name|Desc|TPI|YYY|12|CAT|MT
A27|name|Desc|TPI|YYY|12|CAT|MT
A28|name|Desc|TPI|YYY|12|CAT|MT
第二行中包含更多列分隔符的文件中的数据,如下所示
A26|name|Desc|TPI|YYY|12|CAT|MT
A27|name|Desc|TPI|YYY|12|CAT|MT|||||||||
A28|name|Desc|TPI|YYY|12|CAT|MT
文件中的输出也如上所述。即第二行的最后一列所有管道也被视为数据。
文件中的数据如下。即第一行只有一列,我们不会给出其他列分隔符并给出行分隔符。
A26
A27|name|Desc|TPI|YYY|12|CAT|MT
A28|name|Desc|TPI|YYY|12|CAT|MT
然后文件中的输出如下。我们将第一列合并到第二行的第一列。
A26 A27|name|Desc|TPI|YYY|12|CAT|MT
A28|name|Desc|TPI|YYY|12|CAT|MT
SSIS期望正确的分隔符,只有它才能提供正确的输出。否则输出表中的数据不正确。 这可以以任何方式处理吗?
如果对此问题有任何帮助,我将感激不尽。
答案 0 :(得分:1)
这对你来说是一个很好的起点。
[全球唯一标识符] | [KPI名称] | [KPI描述] | [流程 受影响] | [目的] |策略ID] | [KPI类别] | [KPI度量类型]
A26|name1|Desc|TPI|YYY|12|CAT|MT A27|name2|Desc|TPI|YYY|12|CAT|MT A28|name3|Desc|TPI|YYY|12|CAT|MT B26|name4|Desc|TPI|YYY|12|CAT|MT B27|name5|Desc|TPI|YYY|12|CAT|MT||||||||| B28|name6|Desc|TPI|YYY|12|CAT|MT C26 C27|name7|Desc|TPI|YYY|12|CAT|MT C28|name8|Desc|TPI|YYY|12|CAT|MT
将脚本组件作为源放在DFT上
3.1。转到输入和输出部分
3.2。添加输出。将其命名为GoodRow。
3.2.1 Add the following output columns - GUID, KPIN, KPID, PI, Obj, SID, KPIC, KPIMT
3.3添加另一个输出。将其命名为BadRow。 3.3.1只添加一个输出列:AllFields
现在转到脚本//编辑脚本。输入以下代码。确保添加
使用System.IO;
到命名空间区域。
public override void CreateNewOutputRows()
{
string[] lines = File.ReadAllLines(@"C:\temp\1.txt");
int iRowCount = 0;
int iFieldCountHeader = 0;
string[] fields = null;
foreach (string line in lines)
{
if (iRowCount == 0)
{
iFieldCountHeader = line.Split('|').Length;
iRowCount++;
}
else
{
fields = line.Split('|');
if (fields.Length == iFieldCountHeader) // good row
{
GoodRowBuffer.AddRow();
GoodRowBuffer.GUID = fields[0];
GoodRowBuffer.KPIN = fields[1];
GoodRowBuffer.KPID = fields[2];
GoodRowBuffer.PI = fields[3];
GoodRowBuffer.Obj = fields[4];
GoodRowBuffer.SID = fields[5];
GoodRowBuffer.KPIC = fields[6];
GoodRowBuffer.KPIMT = fields[7];
}
else // bad row
{
BadRowBuffer.AddRow();
BadRowBuffer.AllFields = line;
}
}
}
}
希望这对你有所帮助。请告诉我们。
PS:当您将脚本组件添加为源时,会有一个默认输出。删除它,然后创建上面提到的两个输出。我知道你会这样做,但只是为了确保......