sql >> Database >  >> RDS >> Sqlserver

Waarom herkent SSIS de regelinvoer {LF} rijscheidingsteken niet tijdens het importeren van een plat UTF-8-bestand?

Oorzaak:

SSIS kan het bestand niet lezen en geeft de onderstaande waarschuwing weer vanwege het kolomscheidingsteken Ç ("c" met cedille ) en not vanwege het scheidingsteken {LF} (Regelfeed ).

[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.

Hier is een voorbeeld van een SSIS-pakket dat laat zien hoe het probleem kan worden opgelost met behulp van Script Component en aan het einde is er nog een voorbeeld dat uw probleem simuleert.

Oplossing:

Onderstaand voorbeeldpakket is geschreven in SSIS 2008 R2 . Het leest een plat bestand met rijscheidingsteken {LF} als een enkele kolomwaarde; splitst vervolgens de gegevens met behulp van Script Component om de informatie in een tabel in te voegen in SQL Server 2008 R2 database.

Gebruik Notepad++ om een ​​eenvoudig plat bestand met een paar rijen te maken. Het onderstaande voorbeeldbestand heeft Product-ID en catalogusprijs informatie op elke rij gescheiden door Ç als kolomscheidingsteken en elke rij eindigt op {LF} scheidingsteken.

Klik in Notepad++ op Encoding en klik vervolgens op Encoding in UTF-8 om het platte bestand op te slaan in UTF-8 codering.

Het voorbeeld gebruikt een SQL Server 2008 R2 database genaamd Sora . Maak een nieuwe tabel met de naam dbo.ProductListPrice met behulp van het onderstaande script. SSIS zal de platte bestandsgegevens in deze tabel invoegen.

USE Sora;
GO

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

Maak een SSIS-pakket met behulp van Business Intelligence Development Studio (BIDS) 2008 R2 . Geef het pakket de naam SO_6268205.dtsx . Maak een gegevensbron met de naam Sora.ds om verbinding te maken met de database Sora in SQL Server 2008 R2 .

Klik met de rechtermuisknop ergens in het pakket en klik vervolgens op Variables om het deelvenster met variabelen te bekijken. Maak een nieuwe variabele met de naam ColumnDelimiter van gegevenstype String in het pakketbereik SO_6268205 en stel de variabele in met de waarde Ç

Klik met de rechtermuisknop op de Connection Managers en klik op New Flat File Connection... om een ​​verbinding te maken om het platte bestand te lezen.

Op de General pagina van de Flat File Connection Manager Editor , voer de volgende acties uit:

  • Stel naam verbindingsbeheerder in naar ProductListPrice
  • Stel Beschrijving in naar Flat file connection manager to read product list price information.
  • Selecteer het platte bestandspad. Ik heb het bestand in het pad C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • Selecteer {LF} van Scheidingsteken voor koprij
  • Controleer Column names in the first data row
  • Klik op Columns pagina

Op de Columns pagina van de Flat File Connection Manager Editor , controleer of het Column delimiter is leeg en uitgeschakeld. Klik op Advanced pagina.

Op de Advanced pagina van de Flat File Connection Manager Editor , voer de volgende acties uit.

  • Stel de Naam in naar LineData
  • Controleer of het Kolomscheidingsteken is ingesteld op {LF}
  • Stel het DataType in naar Unicode string [DT_WSTR]
  • Stel de OutputColumnWidth in tot 255
  • Klik op het Preview pagina.

Op de Preview pagina van de Flat File Connection Manager Editor , controleer of de weergegeven gegevens er correct uitzien en klik op OK .

U ziet de gegevensbron Sora en de platte bestandsverbindingsbeheerder ProductListPrice op de Connection Managers tabblad onderaan het pakket.

Slepen en neerzetten Data Flow Task op de Control Flow tabblad van het pakket en noem het als File to database - Without Cedilla delimiter

Dubbelklik op de Gegevensstroomtaak om de weergave over te schakelen naar de Data Flow tabblad op de verpakking. Sleep een Flat File Source op de Gegevensstroom tabblad. Dubbelklik op de Flat File Source om Flat File Source Editor te openen .

Op de Connection Manager pagina van de Flat File Source Editor , selecteer de Flat File Connection Manager ProductListPrice en klik op Kolommen pagina.

Op de Columns pagina van de Flat File Source Editor , controleer de kolom LineData en klik op OK .

Slepen en neerzetten van een Script Component op de Gegevensstroom tabblad onder de Flat File Source , selecteer Transformation en klik op OK . Verbind de groene pijl van Flat File Source naar Scriptcomponent . Dubbelklik op Scriptcomponent om Script Transformation Editor te openen .

Klik op Kolommen invoeren op Script Transformation Editor en selecteer LineData kolom. Klik op Ingangen en uitgangen pagina.

Op de Inputs and Outputs pagina van de Script Transformation Editor , voer de volgende acties uit.

  • Verander de invoernaam in FlatFileInput
  • Verander de naam van de uitgang in SplitDataOutput
  • Selecteer Uitvoerkolommen en klik op Add Column . Herhaal dit nogmaals om nog een kolom toe te voegen.
  • Noem de eerste kolom ProductId
  • Stel het DataType in van kolom ProductId naar Unicode string [DT_WSTR]
  • Stel de Lengte in tot 30

Op de Inputs and Outputs pagina van de Script Transformation Editor , voer de volgende acties uit.

  • Noem de tweede kolom ListPrice
  • Stel het DataType in van kolom Lijstprijs naar numeric [DT_NUMERIC]
  • Stel de Precisie in tot 12
  • Stel de schaal in tot 2
  • Klik op Script pagina om het script te wijzigen

Op het Script pagina van de Script Transformation Editor , voer de volgende acties uit.

  • Klik op de ellipsknop naast ReadOnlyVariables en selecteer de variabele User::ColumnDelimiter
  • Klik op Edit Script...

Plak de onderstaande C# in de Script Editor. Het script voert de volgende taken uit.

  • De waarde van het kolomscheidingsteken Ç . gebruiken gedefinieerd in de variabele User::ColumnDelimiter , de methode FlatFileInput_ProcessInputRow splitst de binnenkomende waarde en wijst deze toe aan de twee uitvoerkolommen die zijn gedefinieerd in de Script Component-transformatie.

Scriptcomponentcode in 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]);
    }
}

Slepen en neerzetten OLE DB Destination op de Gegevensstroom tabblad. Verbind de groene pijl van Script Component naar OLE DB-bestemming . Dubbelklik op OLE DB-bestemming om OLE DB Destination Editor te openen .

Op de Connection Manager pagina van de OLE DB Destination Editor , voer de volgende acties uit.

  • Selecteer Sora van OLE DB Verbindingsbeheer
  • Selecteer Table or view - fast load vanuit Gegevenstoegangsmodus
  • Selecteer [dbo].[ProductListPrice] van Naam van de tafel of de weergave
  • Klik op Toewijzingen pagina

Klik op Mappings pagina op de OLE DB Destination Editor zou automatisch de kolommen toewijzen als de namen van de invoer- en uitvoerkolommen hetzelfde zijn. Klik op OK .

Gegevensstroom tab zou er ongeveer zo uit moeten zien na het configureren van alle componenten.

Voer de query uit select * from dbo.ProductListPrice in de SQL Server Management Studio (SSMS) om het aantal rijen in de tabel te vinden. Het moet leeg zijn voordat het pakket wordt uitgevoerd.

Voer het pakket uit. U zult merken dat het pakket succesvol is verwerkt 9 rijen. Het platte bestand bevat 10 regels, maar de eerste rij is kop met kolomnamen.

Voer de query uit select * from dbo.ProductListPrice in de SQL Server Management Studio (SSMS) om de 9 . te vinden rijen met succes ingevoegd in de tabel. De gegevens moeten overeenkomen met platte bestandsgegevens.

Het bovenstaande voorbeeld illustreerde hoe de gegevens handmatig kunnen worden gesplitst met behulp van Script Component omdat de Flat File Connection Manager treedt een fout op bij het configureren van het kolomscheidingsteken Ç

Probleemsimulatie:

Dit voorbeeld toont een aparte Flat File Connection Manager geconfigureerd met kolomscheidingsteken Ç , die wordt uitgevoerd maar een waarschuwing tegenkomt en geen regels verwerkt.

Klik met de rechtermuisknop op de Connection Managers en klik op New Flat File Connection... om een ​​verbinding te maken om het platte bestand te lezen. Op de General pagina van de Flat File Connection Manager Editor , voer de volgende acties uit:

  • Stel naam verbindingsbeheerder in naar ProductListPrice_Cedilla
  • Stel Beschrijving in op Flat file connection manager with Cedilla column delimiter.
  • Ik heb het bestand in het pad C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt Selecteer het platte bestandspad.
  • Selecteer {LF} van Scheidingsteken voor koprij
  • Controleer Column names in the first data row
  • Klik op Columns pagina

Op de Columns pagina van de Flat File Connection Manager Editor , voer de volgende acties uit:

  • Stel Rijscheidingsteken in naar {LF}
  • Het veld voor het scheidingsteken voor kolommen is mogelijk uitgeschakeld. Klik op Reset Columns
  • Stel Kolomscheidingsteken in naar Ç
  • Klik op Advanced pagina

Op de Advanced pagina van de Flat File Connection Manager Editor , voer de volgende acties uit:

  • Stel de Naam in naar ProductId
  • Stel de ColumnDelimiter in naar Ç
  • Stel het DataType in naar Unicode string [DT_WSTR]
  • Stel de Lengte in tot 30
  • Klik op kolom ListPrice

Op de Advanced pagina van de Flat File Connection Manager Editor , voer de volgende acties uit:

  • Stel de Naam in naar ListPrice
  • Stel de ColumnDelimiter in naar {LF}
  • Stel het DataType in naar numeric [DT_NUMERIC]
  • Stel de DataPrecision in tot 12
  • Stel de DataScale in tot 2
  • Klik op OK

Sleep een Data Flow task op de Control Flow tabblad en noem het als File to database - With Cedilla delimiter . Schakel de eerste gegevensstroomtaak uit.

Configureer de tweede gegevensstroomtaak met Flat File Source en OLE DB Destination

Dubbelklik op de Flat File Source om Flat File Source Editor te openen . Op de Connection Manager pagina van de Flat File Source Editor , selecteer de Flat File Connection Manager ProductListPrice_Cedilla en klik op Kolommen pagina om de kolommen te configureren. Klik op OK .

Voer het pakket uit. Alle componenten hebben een groene kleur om aan te geven dat het proces is geslaagd, maar er worden geen rijen verwerkt. U kunt zien dat er geen rijnummeraanduiding is tussen de Flat File Source en OLE DB Destination

Klik op de Progress tabblad en u ziet het volgende waarschuwingsbericht.

[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. T-SQL:probleem met string concat

  2. eclipse - JPA-entiteiten uit tabellen, geen schema's vermeld

  3. Multitenancy-opties voor PostgreSQL

  4. Geselecteerde gegevens in database invoegen