sql >> Databáze >  >> RDS >> Sqlserver

Proč SSIS při importu plochého souboru UTF-8 nerozpozná oddělovač řádků {LF}?

Příčina:

SSIS nedokáže přečíst soubor a zobrazí níže uvedené varování kvůli oddělovači sloupců Ç ("c" s cedillou ) a not kvůli oddělovači řádků {LF} (Posun řádků ).

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

Zde je ukázkový balíček SSIS, který ukazuje, jak vyřešit problém pomocí Script Component a na konci je další příklad, který simuluje váš problém.

Rozlišení:

Níže uvedený ukázkový balíček je napsán v SSIS 2008 R2 . Přečte plochý soubor s oddělovačem řádků {LF} jako hodnotu jednoho sloupce; poté rozdělí data pomocí Script Component k vložení informací do tabulky v SQL Server 2008 R2 databáze.

Použijte Notepad++ vytvořit jednoduchý plochý soubor s několika řádky. Níže uvedený ukázkový soubor má ID produktu a Katalogová cena informace na každém řádku oddělené Ç jako oddělovač sloupců a každý řádek končí {LF} oddělovač.

V programu Poznámkový blok++ klikněte na Encoding a poté klikněte na Encoding in UTF-8 uložit plochý soubor v UTF-8 kódování.

Ukázka bude používat SQL Server 2008 R2 databáze s názvem Sora . Vytvořte novou tabulku s názvem dbo.ProductListPrice pomocí níže uvedeného skriptu. SSIS vloží data plochého souboru do této tabulky.

USE Sora;
GO

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

Vytvořte balíček SSIS pomocí Business Intelligence Development Studio (BIDS) 2008 R2 . Balíček pojmenujte jako SO_6268205.dtsx . Vytvořte zdroj dat s názvem Sora.ds pro připojení k databázi Sora v SQL Server 2008 R2 .

Klikněte pravým tlačítkem kamkoli do balíčku a poté klikněte na Variables pro zobrazení podokna proměnných. Vytvořte novou proměnnou s názvem ColumnDelimiter datového typu String v rozsahu balíčku SO_6268205 a nastavte proměnnou na hodnotu Ç

Klikněte pravým tlačítkem na Connection Managers a klikněte na New Flat File Connection... pro vytvoření připojení pro čtení plochého souboru.

Na stránce General stránce Editoru Správce připojení plochých souborů , proveďte následující akce:

  • Nastavte Název správce připojení na ProductListPrice
  • Nastavte Popis na Flat file connection manager to read product list price information.
  • Vyberte cestu k plochému souboru. Mám soubor v cestě C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • Vyberte {LF} z Oddělovač řádku záhlaví
  • Zaškrtněte Column names in the first data row
  • Klikněte na Columns stránka

Na stránce Columns stránce Editoru Správce připojení plochých souborů , ověřte, že Column delimiter je prázdná a vypnutá. Klikněte na Advanced stránku.

Na stránce Advanced stránce Editoru Správce připojení plochých souborů , proveďte následující akce.

  • Nastavte Název na LineData
  • Ověřte, že Oddělovač sloupců je nastaven na {LF}
  • Nastavte Datový typ na Unicode string [DT_WSTR]
  • Nastavte OutputColumnWidth na 255
  • Klikněte na Preview stránku.

Na Preview stránce Editoru Správce připojení plochých souborů , ověřte, že zobrazená data vypadají správně, a klikněte na OK .

Uvidíte zdroj dat Sora a správce připojení plochých souborů ProductListPrice na Connection Managers ve spodní části balení.

Přetáhněte Data Flow Task na Tok řízení kartu balíčku a pojmenujte jej jako File to database - Without Cedilla delimiter

Dvakrát klikněte na Úlohu toku dat přepnete zobrazení na Data Flow záložka na obalu. Přetáhněte Flat File Source v Datovém toku tab. Dvakrát klikněte na Zdroj jednoduchého souboru otevřete Flat File Source Editor .

Ve Connection Managers stránku Editoru zdroje plochých souborů , vyberte Správce připojení plochých souborů ProductListPrice a klikněte na Sloupce stránku.

Na stránce Columns stránku Editoru zdroje plochých souborů , zkontrolujte sloupec LineData a klikněte na OK .

Přetáhněte Script Component na Datový tok pod Zdrojem plochého souboru , vyberte Transformation a klikněte na OK . Připojte zelenou šipku z Zdroj plochého souboru na Skriptovou komponentu . Dvakrát klikněte na Skriptová komponenta otevřete Script Transformation Editor .

Klikněte na Vstupní sloupce v Editoru transformace skriptů a vyberte LineData sloupec. Klikněte na Vstupy a výstupy stránku.

Na stránce Inputs and Outputs stránce Editoru transformace skriptů , proveďte následující akce.

  • Změňte název vstupů na FlatFileInput
  • Změňte název výstupů na SplitDataOutput
  • Vyberte Výstupní sloupce a klikněte na Add Column . Chcete-li přidat další sloupec, opakujte tento postup.
  • První sloupec pojmenujte ProductId
  • Nastavte Datový typ sloupce ProductId na Unicode string [DT_WSTR]
  • Nastavte Délku do 30

Na stránce Inputs and Outputs stránce Editoru transformace skriptů , proveďte následující akce.

  • Druhý sloupec pojmenujte ListPrice
  • Nastavte Datový typ ze sloupce Cenová cena na numeric [DT_NUMERIC]
  • Nastavte Přesnost do 12
  • Nastavte Měřítko2
  • Klikněte na Skript stránku upravit skript

Na Script stránce Editoru transformace skriptů , proveďte následující akce.

  • Klikněte na tlačítko se třemi tečkami u ReadOnlyVariables a vyberte proměnnou User::ColumnDelimiter
  • Klikněte na Edit Script...

Vložte níže uvedený C# do editoru skriptů. Skript provádí následující úkoly.

  • Použití hodnoty oddělovače sloupců Ç definované v proměnné User::ColumnDelimiter , metoda FlatFileInput_ProcessInputRow rozdělí příchozí hodnotu a přiřadí ji ke dvěma výstupním sloupcům definovaným v transformaci komponenty skriptu.

Kód komponenty skriptu v 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]);
    }
}

Přetáhněte OLE DB Destination na Datový tok tab. Připojte zelenou šipku z Komponenty skriptu na Cíl OLE DB . Poklepejte na Cíl OLE DB otevřete OLE DB Destination Editor .

Ve Connection Managers stránce Editoru cílů OLE DB , proveďte následující akce.

  • Vyberte Sora z Správce připojení OLE DB
  • Vyberte Table or view - fast load z režimu přístupu k datům
  • Vyberte [dbo].[ProductListPrice] z Název tabulky nebo zobrazení
  • Klikněte na Mapování stránka

Klikněte na Mappings na stránce Editor cílů OLE DB by automaticky mapoval sloupce, pokud jsou názvy vstupních a výstupních sloupců stejné. Klikněte na OK .

Datový tok karta by měla po konfiguraci všech součástí vypadat nějak takto.

Proveďte dotaz select * from dbo.ProductListPrice v SQL Server Management Studio (SSMS) zjistit počet řádků v tabulce. Před spuštěním balíčku by měl být prázdný.

Spusťte balíček. Všimnete si, že balíček byl úspěšně zpracován 9 řádky. Plochý soubor obsahuje 10 řádky, ale první řádek je záhlaví s názvy sloupců.

Proveďte dotaz select * from dbo.ProductListPrice v SQL Server Management Studio (SSMS) najít 9 řádků úspěšně vložených do tabulky. Data by se měla shodovat s daty plochého souboru.

Výše uvedený příklad ilustruje, jak ručně rozdělit data pomocí Skriptové komponenty protože Správce připojení plochých souborů při konfiguraci oddělovače sloupců Ç dojde k chybě

Simulace problému:

Tento příklad ukazuje samostatný Správce připojení plochých souborů nakonfigurováno s oddělovačem sloupců Ç , který se spustí, ale narazí na varování a nezpracuje žádné řádky.

Klikněte pravým tlačítkem na Connection Managers a klikněte na New Flat File Connection... pro vytvoření připojení pro čtení plochého souboru. Na stránce General stránce Editoru Správce připojení plochých souborů , proveďte následující akce:

  • Nastavte Název správce připojení na ProductListPrice_Cedilla
  • Nastavte Popis na Flat file connection manager with Cedilla column delimiter.
  • Mám soubor v cestě C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt Vyberte cestu k plochému souboru.
  • Vyberte {LF} z Oddělovač řádku záhlaví
  • Zaškrtněte Column names in the first data row
  • Klikněte na Columns stránka

Na stránce Columns stránce Editoru Správce připojení plochých souborů , proveďte následující akce:

  • Nastavte Oddělovač řádků na {LF}
  • Pole pro oddělovač sloupců může být zakázáno. Klikněte na Reset Columns
  • Nastavte oddělovač sloupců na Ç
  • Klikněte na Advanced stránka

Na stránce Advanced stránce Editoru Správce připojení plochých souborů , proveďte následující akce:

  • Nastavte Název na ProductId
  • Nastavte ColumnDelimiter na Ç
  • Nastavte Datový typ na Unicode string [DT_WSTR]
  • Nastavte Délku do 30
  • Klikněte na sloupec ListPrice

Na stránce Advanced stránce Editoru Správce připojení plochých souborů , proveďte následující akce:

  • Nastavte Název na ListPrice
  • Nastavte ColumnDelimiter na {LF}
  • Nastavte Datový typ na numeric [DT_NUMERIC]
  • Nastavte DataPrecision do 12
  • Nastavte DataScale2
  • Klikněte na OK

Přetáhněte Data Flow task na Tok řízení a pojmenujte jej jako File to database - With Cedilla delimiter . Zakázat první úlohu toku dat.

Nakonfigurujte druhou úlohu datového toku pomocí Flat File Source a OLE DB Destination

Poklepáním na zdroj plochých souborů otevřete Flat File Source Editor . Ve Connection Managers stránku Editoru zdroje plochých souborů , vyberte Správce připojení plochých souborů ProductListPrice_Cedilla a klikněte na Sloupce stránku pro konfiguraci sloupců. Klikněte na OK .

Spusťte balíček. Všechny komponenty zobrazí zelenou barvu, což znamená, že proces byl úspěšný, ale nebudou zpracovány žádné řádky. Můžete vidět, že mezi Flat File Source nejsou žádná indikace čísel řádků a OLE DB Destination

Klikněte na Progress a všimnete si následující varovné zprávy.

[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. Django nemůže načíst testovací zařízení, IntegrityError

  2. Proměnné relace vs. tabulka Mysql

  3. Vytvořte tabulku v SQL Server 2017

  4. Spouštěč v SQL