0

SSIS は、このシナリオではうまくいきません。

私のフラットファイルには、このような通常のレコードがあります

"1","2","STATUSCHANGED","A","02-MAY-12 21:52:34","","Re","Initial review",""

そして、このようなものもあります。( 複数行にまたがるレコード )

"1","2","SALESNOTIFICATIONRESPOND","Ac","02-MAY-12 21:55:19","From: W, J 
Sent: Wednesday, May 08, 2012 2:00 PM
To: XXXX, A; Acost
Subject: RE: Notification Id 1219 - Qu ID XXXXXX 
I got this from earlier today. Our team is reviewing the request. 



Thanks, 

Hi,

This account belongs to D please approve/deny.

Thanks!

Claud","","","Reassign"

したがって、NOTEPAD + のファイルを見ると、驚くべきことに、複数行にまたがるフィールド内で、そのフィールド内の {CR}{LF} をすべて削除する必要があることがわかります。

このファイルの行区切り文字は LF で、テキスト修飾子は ".

200 個のファイルのコレクションに対して 2 つのことを行う必要がありますか?

  1. ファイル内の {CR}{LF} をすべて削除しますか?
  2. 実際のフィールドに埋め込まれた「はテキスト修飾子ですか?」として削除します。

自動化されたように、このような多数のファイルに対してWindows、DOS、またはVBAでこれを行う方法を知っている人はいますか?

4

4 に答える 4

3

このようなデータの場合、スクリプトコンポーネントを使用して解析を実行することをお勧めします。1つのアプローチを説明するブログ投稿を書きました。

これがお役に立てば幸いです、アンディ

于 2012-05-04T19:47:59.020 に答える
1

Powershellは{CR}{LF}に対してこれを行いますが、これまでPowershellを使用したことがない場合は、コーディングに時間がかかる場合があります。

フィールドの真ん中に表示される「修飾子は実際の混乱です。これをクリーンアップするためのルールを作成できる場合がありますが、成功する保証はありません。

于 2012-05-04T16:11:04.300 に答える
1

適切な行ターミネータが LF であり、すべての行が LF で適切に終了していることが確実な場合は、すべての {CR}{LF} を削除できますが、実際にはその必要はありません。{CR}{LF} が適切にテキスト修飾子のペア内にある限り、そのままインポートする必要があります。

はい、フィールド全体がテキスト修飾子で囲まれている場合は、実際のフィールド内からテキスト修飾子を削除する (または必要に応じてエスケープする) 必要があります。それは混乱を引き起こします。

個人的には、Pythonスクリプトを作成してデータを SSIS に供給する前に前処理するか、スクリプト全体を SQL にインポートすることでこれに取り組みます。

于 2012-05-04T16:21:14.737 に答える
0

私はアンディに同意します。同様の問題があり、スクリプト コンポーネント タスクで対処しました。コードは次のようになります (CR LF の問題を処理しません)。

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
        Dim strRow As String
        Dim strColSeperator As String
        Dim rowValues As String()
        strRow = Row.Line.ToString()
        If strRow.Contains(",") Then
            strColSeperator = (",")
        ElseIf strRow.Contains(";") Then
            strColSeperator = ";"
        End If

        rowValues = Row.Line.Split(CChar(strColSeperator))
        If (rowValues.Length > 1) Then
            Row.Code = rowValues.GetValue(0).ToString()
            Row.Description = rowValues.GetValue(1).ToString()
            Row.Blank = rowValues.GetValue(2).ToString()
            Row.Weight = rowValues.GetValue(3).ToString()
            Row.Scan = rowValues.GetValue(4).ToString()
        End If
    End Sub

End Class

ステップバイステップのチュートリアルは、Andy Mitchell の投稿で入手できます。

于 2012-05-04T21:19:20.480 に答える