0

我有一个带有列分隔符的文本文件 | (管道)和行分隔符作为 CRLF(新行字符)。输出是一个 SQL 表。如果文件中的数据有更多管道(|)或更多 CRLF 字符,那么我的连接管理器如下所示:-

  1. 文件中的数据。格式正确。那么表中的输出是对的。

    [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
    
  2. 文件中的数据在第二行中具有更多列分隔符,如下所示

    A26|name|Desc|TPI|YYY|12|CAT|MT
    A27|name|Desc|TPI|YYY|12|CAT|MT|||||||||
    A28|name|Desc|TPI|YYY|12|CAT|MT
    

    文件中的输出也如上。即第二行的最后一列的所有管道也被视为数据。

  3. 文件中的数据如下。即第一行只有一列,我们不会给出其他列分隔符并给出行分隔符。

     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 需要正确的分隔符,然后才会给出正确的输出。否则输出表中的数据不正确。这可以以任何方式处理吗?

如果对此问题有任何帮助,我将不胜感激。

4

1 回答 1

1

这对您来说是一个很好的起点。

  1. 我使用以下文件作为源。将其保存到 C:\Temp\1.TXT

[全局唯一标识符]|[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
  1. 在控制流表面上放置一个 DFT。
  2. 将脚本组件作为源放在 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

  3. 现在转到脚本//编辑脚本。把下面的代码。确保添加

使用 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;
            }

        }
    }
}
  1. 测试您的代码:在您放置 Script 组件的正下方添加两个 Union All 组件。将一个命名为 GoodRows,另一个命名为 BadRows。将 Script 组件的两个输出连接到这些 Union All 组件。放置数据查看器。

希望这对您有所帮助。请告诉我们。

PS:当你添加一个 Script 组件作为 Source 时,有一个默认输出。删除它,然后创建上面提到的两个输出。我知道你会那样做,但只是为了确保...

于 2013-04-16T20:16:27.477 回答