sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor genkender SSIS ikke linjefeed {LF} rækkeafgrænser under import af UTF-8 flad fil?

Årsag:

SSIS kan ikke læse filen og viser nedenstående advarsel på grund af kolonneafgrænseren Ç ("c" med cedilla ) og not på grund af linjeafgrænseren {LF} (Linjefeed ).

[Read flat file [1]] Warning: The end of the data file was reached while 
reading header rows. Make sure the header row delimiter and the number of 
header rows to skip are correct.

Her er et eksempel på en SSIS-pakke, der viser, hvordan du løser problemet ved hjælp af Script Component og i slutningen er der et andet eksempel, der simulerer dit problem.

Opløsning:

Nedenstående eksempelpakke er skrevet i SSIS 2008 R2 . Den læser en flad fil med rækkeskilletegn {LF} som en enkelt kolonneværdi; opdeler derefter dataene ved hjælp af Script Component for at indsætte oplysningerne i en tabel i SQL Server 2008 R2 database.

Brug Notepad++ at oprette en simpel flad fil med få rækker. Nedenstående eksempelfil har Produkt-id og Listepris oplysninger om hver række adskilt af Ç som kolonneafgrænser, og hver række slutter med {LF} afgrænsning.

På Notesblok++ skal du klikke på Encoding og klik derefter på Encoding in UTF-8 for at gemme den flade fil i UTF-8 kodning.

Eksemplet vil bruge en SQL Server 2008 R2 database med navnet Sora . Opret en ny tabel med navnet dbo.ProductListPrice ved at bruge nedenstående script. SSIS vil indsætte de flade fildata i denne tabel.

USE Sora;
GO

CREATE TABLE dbo.ProductListPrice
(
        ProductId   nvarchar(30)    NOT NULL
    ,   ListPrice   numeric(12,2)   NOT NULL
);
GO

Opret en SSIS-pakke ved hjælp af Business Intelligence Development Studio (BIDS) 2008 R2 . Navngiv pakken som SO_6268205.dtsx . Opret en datakilde ved navn Sora.ds for at oprette forbindelse til databasen Sora i SQL Server 2008 R2 .

Højreklik hvor som helst i pakken, og klik derefter på Variables for at se variabelruden. Opret en ny variabel ved navn ColumnDelimiter af datatypen String i pakkens omfang SO_6268205 og indstil variablen med værdien Ç

Højreklik på Connection Managers og klik på New Flat File Connection... for at oprette en forbindelse til at læse den flade fil.

General siden i Flat File Connection Manager Editor , udfør følgende handlinger:

  • Indstil Forbindelsesadministratornavn til ProductListPrice
  • Indstil Beskrivelse til Flat file connection manager to read product list price information.
  • Vælg den flade filsti. Jeg har filen i stien C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • Vælg {LF} fra Overskriftsrækkeafgrænser
  • Tjek Column names in the first data row
  • Klik på Columns side

Columns siden i Flat File Connection Manager Editor , skal du kontrollere, at Column delimiter er tom og deaktiveret. Klik på Advanced side.

Advanced siden i Flat File Connection Manager Editor , udfør følgende handlinger.

  • Indstil navnet til LineData
  • Bekræft, at Kolonneadskilleren er indstillet til {LF}
  • Indstil DataType til Unicode string [DT_WSTR]
  • Indstil OutputColumnWidth til 255
  • Klik på Preview side.

Preview siden i Flat File Connection Manager Editor , kontroller, at de viste data ser korrekte ud, og klik på OK .

Du vil se datakilden Sora og den flade filforbindelsesadministrator ProductListPriceConnection Managers fanen i bunden af ​​pakken.

Træk og slip Data Flow TaskKontrolflow fanen i pakken og navngiv den som File to database - Without Cedilla delimiter

Dobbeltklik på Dataflow-opgaven for at skifte visningen til Data Flow fanen på pakken. Træk og slip en Flat File Source Dataflow fanen. Dobbeltklik på Flad filkilde for at åbne Flat File Source Editor .

Connection Manager side i Flat File Source Editor , vælg Fad File Connection Manager ProductListPrice og klik på Kolonner side.

Columns side i Flat File Source Editor , tjek kolonnen LineData og klik på OK .

Træk og slip en Script Component Dataflow fanen under Flad filkilde , vælg Transformation og klik på OK . Tilslut den grønne pil fra Flad filkilde til Script-komponent . Dobbeltklik på Script-komponent for at åbne Script Transformation Editor .

Klik på Indtast kolonnerScript Transformation Editor og vælg LineData kolonne. Klik på Indgange og udgange side.

Inputs and Outputs side i Script Transformation Editor , udfør følgende handlinger.

  • Skift inputnavnet til FlatFileInput
  • Skift outputnavnet til SplitDataOutput
  • Vælg Outputkolonner og klik på Add Column . Gentag dette igen for at tilføje endnu en kolonne.
  • Navngiv den første kolonne ProductId
  • Indstil DataType i kolonnen ProductId til Unicode string [DT_WSTR]
  • Indstil Længde til 30

Inputs and Outputs side i Script Transformation Editor , udfør følgende handlinger.

  • Navngiv den anden kolonne ListPrice
  • Indstil DataType af kolonnen Listepris til numeric [DT_NUMERIC]
  • Indstil præcision til 12
  • Indstil Skala til 2
  • Klik på Script side for at ændre scriptet

Script side i Script Transformation Editor , udfør følgende handlinger.

  • Klik på ellipseknappen ud for ReadOnlyVariables og vælg variablen User::ColumnDelimiter
  • Klik på Edit Script...

Indsæt nedenstående C# i Script Editor. Scriptet udfører følgende opgaver.

  • Brug af kolonneafgrænserværdien Ç defineret i variablen User::ColumnDelimiter , metoden FlatFileInput_ProcessInputRow opdeler den indgående værdi og tildeler den til de to outputkolonner, der er defineret i scriptkomponent-transformationen.

Script-komponentkode i C#

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void PreExecute()
    {
        base.PreExecute();
    }

    public override void PostExecute()
    {
        base.PostExecute();
    }

    public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row)
    {
        const int COL_PRODUCT = 0;
        const int COL_PRICE = 1;

        char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter);
        string[] lineData = Row.LineData.ToString().Split(delimiter);

        Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT]) 
                            ? String.Empty 
                            : lineData[COL_PRODUCT];

        Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE]) 
                            ? 0 
                            : Convert.ToDecimal(lineData[COL_PRICE]);
    }
}

Træk og slip OLE DB Destination Dataflow fanen. Tilslut den grønne pil fra Script-komponent til OLE DB-destination . Dobbeltklik på OLE DB-destination for at åbne OLE DB Destination Editor .

Connection Manager siden i OLE DB Destination Editor , udfør følgende handlinger.

  • Vælg Sora fra OLE DB Connection Manager
  • Vælg Table or view - fast load fra Dataadgangstilstand
  • Vælg [dbo].[ProductListPrice] fra Navn på tabellen eller visningen
  • Klik på Mappings side

Klik på Mappings side på OLE DB Destination Editor vil automatisk kortlægge kolonnerne, hvis input- og outputkolonnenavnene er de samme. Klik på OK .

Dataflow fanen skulle se nogenlunde sådan ud efter at have konfigureret alle komponenterne.

Udfør forespørgslen select * from dbo.ProductListPrice i SQL Server Management Studio (SSMS) for at finde antallet af rækker i tabellen. Den skal være tom, før pakken udføres.

Udfør pakken. Du vil bemærke, at pakken blev behandlet med succes 9 rækker. Den flade fil indeholder 10 linjer, men den første række er overskrift med kolonnenavne.

Udfør forespørgslen select * from dbo.ProductListPrice i SQL Server Management Studio (SSMS) for at finde 9 rækker indsat i tabellen. Dataene skal matche med flade fildata.

Ovenstående eksempel illustrerede, hvordan man manuelt deler dataene ved hjælp af Script-komponent fordi Flat File Connection Manager støder på fejl, når kolonneafgrænseren Ç er konfigureret

Problemsimulering:

Dette eksempel viser en separat Fad File Connection Manager konfigureret med kolonneafgrænser Ç , som udfører, men støder på en advarsel og ikke behandler nogen linjer.

Højreklik på Connection Managers og klik på New Flat File Connection... for at oprette en forbindelse til at læse den flade fil. På General siden i Flat File Connection Manager Editor , udfør følgende handlinger:

  • Indstil Forbindelsesadministratornavn til ProductListPrice_Cedilla
  • Sæt Beskrivelse til Flat file connection manager with Cedilla column delimiter.
  • Jeg har filen i stien C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt Vælg den flade filsti.
  • Vælg {LF} fra Overskriftsrækkeafgrænser
  • Tjek Column names in the first data row
  • Klik på Columns side

Columns siden i Flat File Connection Manager Editor , udfør følgende handlinger:

  • Indstil rækkeskilletegn til {LF}
  • Kolonneafgrænserfeltet kan være deaktiveret. Klik på Reset Columns
  • Indstil Søjleadskiller til Ç
  • Klik på Advanced side

Advanced siden i Flat File Connection Manager Editor , udfør følgende handlinger:

  • Indstil navnet til ProductId
  • Indstil ColumnDelimiter til Ç
  • Indstil DataType til Unicode string [DT_WSTR]
  • Indstil Længde til 30
  • Klik på kolonnen ListPrice

Advanced siden i Flat File Connection Manager Editor , udfør følgende handlinger:

  • Indstil navnet til ListPrice
  • Indstil ColumnDelimiter til {LF}
  • Indstil DataType til numeric [DT_NUMERIC]
  • Indstil Datapræcision til 12
  • Indstil DataScale til 2
  • Klik på OK

Træk og slip en Data Flow taskKontrolflow faneblad og navngiv den som File to database - With Cedilla delimiter . Deaktiver den første dataflowopgave.

Konfigurer den anden dataflowopgave med Flat File Source og OLE DB Destination

Dobbeltklik på flad filkilde for at åbne Flat File Source Editor . På Connection Manager side i Flat File Source Editor , vælg Fad File Connection Manager ProductListPrice_Cedilla og klik på Kolonner side for at konfigurere kolonnerne. Klik på OK .

Udfør pakken. Alle komponenter vil vise grøn farve for at angive, at processen var succesfuld, men ingen rækker vil blive behandlet. Du kan se, at der ikke er nogen indikation af rækkenumre mellem Flat File Source og OLE DB Destination

Klik på Progress fanen, og du vil bemærke følgende advarselsmeddelelse.

[Read flat file [1]] Warning: The end of the data file was reached while 
reading header rows. Make sure the header row delimiter and the number of 
header rows to skip are correct.



  1. Kan jeg gemme billeder i MySQL

  2. MySql localhost vs Amazon RDS-instans

  3. indsæt enkelt sæt data flere gange mysql

  4. 3 måder at finde rækker, der indeholder store bogstaver i SQLite