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ěřítko až
2
- 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 , metodaFlatFileInput_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 DataScale až
2
- 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.