2017-06-12 6 views
2

Ich arbeite an SSIS und ich habe die komplexe unstrukturierte TEXT-Datei, ich muss die Textdatei durch Erstellen von SSIS-Paketen analysieren und die erforderlichen Spalten erhalten Daten in der DataBase.Was ist der beste Weg, um die Textdatei zu analysieren und wie kann ich das Skript schreiben, um jede Zeile in dieser Textdatei zu lesen. Ich war auch verwirrt, ob ich jede Zeile der TEXT-Datei lesen kann, ohne ein Skript zu schreiben?Unstrukturierte Textdatei in SSIS analysieren und jede Zeile lesen, um die erforderlichen Daten zu erhalten

Erforderliche Spalten aus der Textdatei Daten DEVICEID, Datenwert und dataunits:

Hier ist der Text-Datei ist:

12/02/2015 09:47:44:745 SecureHARTPort version: 1.1.12.0. 

    12/02/2015 09:47:44:745 Connecting and initialing Session to 
    67.40.65.181 Port:5094 Tcp 
    12/02/2015 09:47:44:745 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 0 
    Status: 0x00 
    TranId: 1, Data ByteCount: 5 
    Data: 01 00 09 27 C0 

    12/02/2015 09:47:44:761 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 0 
    Status: 0x00 
    TranId: 1, Data ByteCount: 5 
    Data: 01 00 09 27 C0 
    12/02/2015 09:47:44:855 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
    Status: 0x00 
TranId: 2, Data ByteCount: 5 
Data: 02 80 00 00 82 

12/02/2015 09:47:44:855 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
Status: 0x00 
TranId: 2, Data ByteCount: 29 
Data: 06 80 00 18 00 50 FE 26 4E 05 07 05 02 0E 0C 0B 6A 64 05 04 00 01 50 
00 26 00 26 84 8E 

Rx Cmd=0, Rsp code=0x00, Device Status=0x50 
Expansion Code=254 
Expanded Device Type=9806 
# Request Preambles=5 
Universal Comand Revision Level=7 
Transmitter HART Revision Level=5 
Software Revision=2 
Hardware Revision Level/Physical Signaling Code=14 
Flags=0C 
Device ID=748132 
Minimum # Response Preambles=5 
Max # of device variables=4 
Configuration Change Counter=1 
Extended Field Device Status=50 
Manufacturer's ID=38 
Private Label Distributor=38 
Device Profile=132 

12/02/2015 09:47:44:855 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
Status: 0x00 
TranId: 3, Data ByteCount: 9 
    Data: 82 A6 4E 0B 6A 64 14 00 7B 

    12/02/2015 09:47:44:870 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
    Status: 0x00 
    TranId: 3, Data ByteCount: 43 
    Data: 86 A6 4E 0B 6A 64 14 22 00 50 77 69 68 61 72 74 67 77 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 

Rx Cmd=20, Rsp code=0x00, Device Status=0x50 
Long Tag=wihartgw 

    12/02/2015 09:47:44:870 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
Status: 0x00 
TranId: 4, Data ByteCount: 9 
Data: 82 A6 4E 0B 6A 64 4A 00 25 

12/02/2015 09:47:44:886 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
Status: 0x00 
TranId: 4, Data ByteCount: 19 
    Data: 86 A6 4E 0B 6A 64 4A 0A 00 50 01 01 65 00 05 02 01 03 1B 

    Rx Cmd=74, Rsp code=0x00, Device Status=0x50 
Max Num IO Cards=1 
Max Num Channels per IO Card=1 
Max Num Sub-Devices per Channel=101 
    Num Devices Detected=5 
    Max Num DR Supported=2 
    Master Mode for Comm=1 
    Retry Count for Sub-Device=3 

    Rx Cmd=9, Rsp code=0x00, Device Status=0x50 
    Extended Device Status=0 
    Slot0 Var Code=246 
    Slot0 Var Classification=0 
    Slot0 Var Units=251 
    Slot0 Var Value=4 
    Slot0 Var Status=C0 
    Slot1 Var Code=116 
    Slot1 Var Classification=209 
    Slot1 Var Units=70 
Slot1 Var Value=0 

Antwort

0

Sie müssen auf jeden Fall ein Skript-Task verwenden, um dies zu handhaben.

Die Skript Aufgabe kann das Dateisystemobjekt verwenden, um einen Verweis auf die Datei zu erhalten und es Zeile für Zeile, auf der Suche nach Zeichenkette wie zu lesen:

Device ID=xxx 
Value=xxx 
Units=xxx 

Und immer, was auch immer der Wert xxx jeweils und Einfügen in die Datenbank.

2

Sie wissen nicht, ob dies wird Ihnen helfen, aber mit einem T-SQL-Skript wie das folgende Sie zuerst den Text lesen kann line-by-line und dann einen entsprechenden Filter verwenden:

DECLARE @YourText NVARCHAR(MAX)= 
N' 12/02/2015 09:47:44:745 SecureHARTPort version: 1.1.12.0. 

    12/02/2015 09:47:44:745 Connecting and initialing Session to 
    67.40.65.181 Port:5094 Tcp 
    12/02/2015 09:47:44:745 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 0 
    Status: 0x00 
    TranId: 1, Data ByteCount: 5 
    Data: 01 00 09 27 C0 

    12/02/2015 09:47:44:761 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 0 
    Status: 0x00 
    TranId: 1, Data ByteCount: 5 
    Data: 01 00 09 27 C0 
    12/02/2015 09:47:44:855 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
    Status: 0x00 
TranId: 2, Data ByteCount: 5 
Data: 02 80 00 00 82 

12/02/2015 09:47:44:855 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
Status: 0x00 
TranId: 2, Data ByteCount: 29 
Data: 06 80 00 18 00 50 FE 26 4E 05 07 05 02 0E 0C 0B 6A 64 05 04 00 01 50 
00 26 00 26 84 8E 

Rx Cmd=0, Rsp code=0x00, Device Status=0x50 
Expansion Code=254 
Expanded Device Type=9806 
# Request Preambles=5 
Universal Comand Revision Level=7 
Transmitter HART Revision Level=5 
Software Revision=2 
Hardware Revision Level/Physical Signaling Code=14 
Flags=0C 
Device ID=748132 
Minimum # Response Preambles=5 
Max # of device variables=4 
Configuration Change Counter=1 
Extended Field Device Status=50 
Manufacturer''s ID=38 
Private Label Distributor=38 
Device Profile=132 

12/02/2015 09:47:44:855 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
Status: 0x00 
TranId: 3, Data ByteCount: 9 
    Data: 82 A6 4E 0B 6A 64 14 00 7B 

    12/02/2015 09:47:44:870 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
    Status: 0x00 
    TranId: 3, Data ByteCount: 43 
    Data: 86 A6 4E 0B 6A 64 14 22 00 50 77 69 68 61 72 74 67 77 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 

Rx Cmd=20, Rsp code=0x00, Device Status=0x50 
Long Tag=wihartgw 

    12/02/2015 09:47:44:870 Tx: Message Header: Ver: 1, MsgType: 0, MsgId: 3 
Status: 0x00 
TranId: 4, Data ByteCount: 9 
Data: 82 A6 4E 0B 6A 64 4A 00 25 

12/02/2015 09:47:44:886 Rx: Message Header: Ver: 1, MsgType: 1, MsgId: 3 
Status: 0x00 
TranId: 4, Data ByteCount: 19 
    Data: 86 A6 4E 0B 6A 64 4A 0A 00 50 01 01 65 00 05 02 01 03 1B 

    Rx Cmd=74, Rsp code=0x00, Device Status=0x50 
Max Num IO Cards=1 
Max Num Channels per IO Card=1 
Max Num Sub-Devices per Channel=101 
    Num Devices Detected=5 
    Max Num DR Supported=2 
    Master Mode for Comm=1 
    Retry Count for Sub-Device=3 

    Rx Cmd=9, Rsp code=0x00, Device Status=0x50 
    Extended Device Status=0 
    Slot0 Var Code=246 
    Slot0 Var Classification=0 
    Slot0 Var Units=251 
    Slot0 Var Value=4 
    Slot0 Var Status=C0 
    Slot1 Var Code=116 
    Slot1 Var Classification=209 
    Slot1 Var Units=70 
Slot1 Var Value=0'; 

--Die Abfrage werden die Linien in einer beliebigen Kombination von CHAR(13) and/or CHAR(10) geschnitten:

WITH LineByLine AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS LineNr 
      ,LTRIM(RTRIM(x.value(N'(text())[1]',N'nvarchar(max)'))) AS Line 
    FROM 
    (
    SELECT CAST(N'<x>' + REPLACE((SELECT REPLACE(REPLACE(REPLACE(@YourText,NCHAR(10),NCHAR(13)),NCHAR(13)+NCHAR(13),NCHAR(13)),NCHAR(13),N'\nl') AS [*] FOR XML PATH('')),N'\nl',N'</x><x>') + N'</x>'AS XML) AS Casted 
    ) AS t 
    CROSS APPLY Casted.nodes(N'/x[text()]') AS A(x) 
) 
SELECT LineNr,Line 
FROM LineByLine 
WHERE CHARINDEX('Device ID=',Line)>0 
    OR CHARINDEX('Data:',Line)>0 
    OR CHARINDEX('unit',Line)>0; 

Das Ergebnis wäre:

Nr Line 
7 Data: 01 00 09 27 C0 
11 Data: 01 00 09 27 C0 
15 Data: 02 80 00 00 82 
19 Data: 06 80 00 18 00 50 FE 26 4E 05 07 05 02 0E 0C 0B 6A 64 05 04 00 01 50 
30 Device ID=748132 
41 Data: 82 A6 4E 0B 6A 64 14 00 7B 
45 Data: 86 A6 4E 0B 6A 64 14 22 00 50 77 69 68 61 72 74 67 77 00 00 00 00 00 
52 Data: 82 A6 4E 0B 6A 64 4A 00 25 
56 Data: 86 A6 4E 0B 6A 64 4A 0A 00 50 01 01 65 00 05 02 01 03 1B 
69 Slot0 Var Units=251 
74 Slot1 Var Units=70 

Sie haben geben Sie Ihre erwartete Ausgabe nicht, weder sind die angegebenen Spaltennamen in Ihrem Text, so wird dies zu erraten ... Hoffe, es hilft ...

+0

Danke, aber ich brauche die Hilfe, wie das Skript zu schreiben, in die Skriptkomponente, um jede Zeile zu lesen, weil ich den harten Code nicht kenne. – a5656

+0

@akhil Eine synchrone Skriptkomponente hat eine Methode namens InputBuffer0_ProcessInputRow, die in jeder Zeile aufgerufen wird. [Lesen Sie mehr in diesem MSDN-Artikel] (https://docs.microsoft.com/en-us/sql/integration-services/extending-packages-scripting-data-flow-script-component-types/creating-a-synchronous -transformation-with-the-script-Komponente), aber Sie müssen dieses Skript in C# oder Vb.net schreiben – Hadi

Verwandte Themen