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. 以下のように、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
    

    ファイルの出力も上記のとおりです。つまり、2 行目の最後の列には、すべてのパイプラインもデータと見なされます。

  3. ファイル内のデータは次のとおりです。つまり、最初の行に 1 つの列しかないため、他の列区切り記号を付けず、行区切り記号を付けます。

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

次に、ファイルの出力は次のようになります。最初の列を 2 行目の最初の列にマージします。

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. 出力を追加します。グッドロウと名づけます。

     3.2.1 Add the following output columns - GUID, KPIN, KPID, PI, Obj, SID, KPIC, KPIMT
    

    3.3 別の出力を追加します。BadRow と名付けます。3.3.1 出力列を 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 コンポーネントを 2 つ追加します。Script コンポーネントの 2 つの出力をこれらの Union All コンポーネントに接続します。データビューアを入れてください。

うまくいけば、これはあなたを助けるはずです. お知らせください。

PS: スクリプト コンポーネントをソースとして追加すると、デフォルトの出力が表示されます。それを削除してから、上記の 2 つの出力を作成します。私はあなたがそれをしたことを知っていますが、念のために...

于 2013-04-16T20:16:27.477 に答える