Przyczyna:
SSIS nie odczytuje pliku i wyświetla poniższe ostrzeżenie z powodu ogranicznika kolumny Ç
("c" z cedillą ) i not
ze względu na ogranicznik linii {LF}
(Kanał wiersza ).
[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.
Oto przykładowy pakiet SSIS, który pokazuje, jak rozwiązać problem za pomocą Script Component
a na końcu jest inny przykład, który symuluje Twój problem.
Rozdzielczość:
Poniższy przykładowy pakiet jest napisany w SSIS 2008 R2
. Czyta płaski plik z separatorem wierszy {LF}
jako wartość w pojedynczej kolumnie; następnie dzieli dane za pomocą Script Component
aby wstawić informacje do tabeli w SQL Server 2008 R2
baza danych.
Użyj Notepad++
stworzyć prosty plik płaski z kilkoma wierszami. Poniższy przykładowy plik ma Identyfikator produktu i Cena katalogowa informacje w każdym wierszu oddzielone Ç
jako ogranicznik kolumny, a każdy wiersz kończy się {LF}
ogranicznik.
W Notepad++ kliknij Encoding
a następnie kliknij Encoding in UTF-8
aby zapisać płaski plik w UTF-8
kodowanie.
Przykład będzie używał SQL Server 2008 R2
baza danych o nazwie Sora
. Utwórz nową tabelę o nazwie dbo.ProductListPrice
za pomocą poniższego skryptu. SSIS wstawi do tej tabeli dane w postaci zwykłego pliku.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Utwórz pakiet SSIS za pomocą Business Intelligence Development Studio (BIDS) 2008 R2 . Nazwij pakiet jako SO_6268205.dtsx
. Utwórz źródło danych o nazwie Sora.ds
połączyć się z bazą danych Sora
w SQL Server 2008 R2 .
Kliknij prawym przyciskiem myszy w dowolnym miejscu pakietu, a następnie kliknij Variables
aby wyświetlić okienko zmiennych. Utwórz nową zmienną o nazwie ColumnDelimiter
typu danych String
w zakresie pakietu SO_6268205
i ustaw zmienną na wartość Ç
Kliknij prawym przyciskiem myszy Connection Managers
i kliknij New Flat File Connection...
aby utworzyć połączenie w celu odczytania pliku płaskiego.
W sekcji General
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę menedżera połączeń do
ProductListPrice
- Ustaw Opis do
Flat file connection manager to read product list price information.
- Wybierz płaską ścieżkę pliku. Mam plik w ścieżce
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
- Wybierz
{LF}
z Ogranicznik wiersza nagłówka - Sprawdź
Column names in the first data row
- Kliknij
Columns
strona
W Columns
strona Edytora menedżera połączeń z płaskim plikiem , sprawdź, czy Column delimiter
jest puste i wyłączone. Kliknij Advanced
strona.
W Advanced
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności.
- Ustaw nazwę do
LineData
- Sprawdź, czy ogranicznik kolumny jest ustawiony na
{LF}
- Ustaw Typ danych do
Unicode string [DT_WSTR]
- Ustaw OutputColumnWidth do
255
- Kliknij
Preview
strona.
W Preview
strona Edytora menedżera połączeń z płaskim plikiem , sprawdź, czy wyświetlane dane wyglądają prawidłowo i kliknij OK
.
Zobaczysz źródło danych Sora i menedżera połączeń plików płaskich ProductListPrice w Connection Managers
zakładka na dole opakowania.
Przeciągnij i upuść Data Flow Task
na przepływ sterowania pakietu i nazwij go jako File to database - Without Cedilla delimiter
Kliknij dwukrotnie Zadanie przepływu danych aby przełączyć widok na Data Flow
zakładka na opakowaniu. Przeciągnij i upuść Flat File Source
w przepływie danych patka. Kliknij dwukrotnie Źródło pliku płaskiego aby otworzyć Flat File Source Editor
.
W Connection Managers
strona Edytora źródeł plików płaskich , wybierz Menedżera połączeń plików płaskich ProductListPrice
i kliknij Kolumny strona.
W Columns
strona Edytora źródeł plików płaskich , sprawdź kolumnę LineData
i kliknij OK
.
Przeciągnij i upuść Script Component
na przepływ danych zakładka pod Źródłem pliku płaskiego , wybierz Transformation
i kliknij OK
. Połącz zieloną strzałkę ze Źródła pliku płaskiego do komponentu skryptów . Kliknij dwukrotnie Komponent skryptu aby otworzyć Script Transformation Editor
.
Kliknij Kolumny wejściowe w Edytorze transformacji skryptów i wybierz LineData
kolumna. Kliknij Wejścia i wyjścia strona.
Na Inputs and Outputs
strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Zmień nazwę wejścia na FlatFileInput
- Zmień nazwę wyjścia na
SplitDataOutput
- Wybierz Kolumny wyjściowe i kliknij
Add Column
. Powtórz to jeszcze raz, aby dodać kolejną kolumnę. - Nazwij pierwszą kolumnę
ProductId
- Ustaw Typ danych kolumny Identyfikator produktu do
Unicode string [DT_WSTR]
- Ustaw Długość do
30
Na Inputs and Outputs
strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Nazwij drugą kolumnę
ListPrice
- Ustaw Typ danych kolumny ListPrice do
numeric [DT_NUMERIC]
- Ustaw precyzję do
12
- Ustaw skalę do
2
- Kliknij Skrypt strona do modyfikacji skryptu
W Script
strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Kliknij przycisk z wielokropkiem na ReadOnlyVariables i wybierz zmienną
User::ColumnDelimiter
- Kliknij
Edit Script...
Wklej poniższy C# w edytorze skryptów. Skrypt wykonuje następujące zadania.
- Korzystanie z wartości ogranicznika kolumny
Ç
zdefiniowana w zmiennej User::ColumnDelimiter , metodaFlatFileInput_ProcessInputRow
dzieli przychodzącą wartość i przypisuje ją do dwóch kolumn wyjściowych zdefiniowanych w transformacji komponentu skryptu.
Kod komponentu skryptu w 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]);
}
}
Przeciągnij i upuść OLE DB Destination
na przepływ danych patka. Połącz zieloną strzałkę z komponentu skryptów do miejsca docelowego OLE DB . Kliknij dwukrotnie Miejsce docelowe OLE DB aby otworzyć OLE DB Destination Editor
.
W Connection Managers
strona Edytora docelowego OLE DB , wykonaj następujące czynności.
- Wybierz
Sora
z Menedżera połączeń OLE DB - Wybierz
Table or view - fast load
z trybu dostępu do danych - Wybierz
[dbo].[ProductListPrice]
z Nazwa tabeli lub widoku - Kliknij Odwzorowania strona
Kliknij Mappings
w Edytorze miejsca docelowego OLE DB automatycznie mapuje kolumny, jeśli nazwy kolumn wejściowych i wyjściowych są takie same. Kliknij OK
.
Przepływ danych zakładka powinna wyglądać mniej więcej tak po skonfigurowaniu wszystkich komponentów.
Wykonaj zapytanie select * from dbo.ProductListPrice
w SQL Server Management Studio (SSMS) aby znaleźć liczbę wierszy w tabeli. Powinien być pusty przed wykonaniem pakietu.
Wykonaj pakiet. Zauważysz, że paczka została pomyślnie przetworzona 9 wydziwianie. Plik płaski zawiera 10 wiersze, ale pierwszy wiersz to nagłówek z nazwami kolumn.
Wykonaj zapytanie select * from dbo.ProductListPrice
w SQL Server Management Studio (SSMS) znaleźć 9 wiersze pomyślnie wstawione do tabeli. Dane powinny być zgodne z danymi w pliku tekstowym.
Powyższy przykład ilustruje, jak ręcznie podzielić dane za pomocą komponentu skryptów ponieważ Menedżer połączeń plików płaskich napotyka błąd podczas konfigurowania ogranicznika kolumny Ç
Symulacja problemu:
Ten przykład pokazuje oddzielny Menedżer połączeń plików płaskich skonfigurowany z ogranicznikiem kolumny Ç
, który wykonuje się, ale napotyka ostrzeżenie i nie przetwarza żadnych wierszy.
Kliknij prawym przyciskiem myszy Connection Managers
i kliknij New Flat File Connection...
aby utworzyć połączenie w celu odczytania pliku tekstowego. W sekcji General
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę menedżera połączeń do
ProductListPrice_Cedilla
- Ustaw Opis na
Flat file connection manager with Cedilla column delimiter.
- Mam plik w ścieżce
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
Wybierz płaską ścieżkę pliku. - Wybierz
{LF}
z Ogranicznik wiersza nagłówka - Sprawdź
Column names in the first data row
- Kliknij
Columns
strona
W Columns
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw separator wierszy do
{LF}
- Pole ogranicznika kolumny może być wyłączone. Kliknij
Reset Columns
- Ustaw ogranicznik kolumny do
Ç
- Kliknij
Advanced
strona
W Advanced
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę do
ProductId
- Ustaw ColumnDelimiter do
Ç
- Ustaw Typ danych do
Unicode string [DT_WSTR]
- Ustaw Długość do
30
- Kliknij kolumnę
ListPrice
W Advanced
strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę do
ListPrice
- Ustaw ColumnDelimiter do
{LF}
- Ustaw Typ danych do
numeric [DT_NUMERIC]
- Ustaw DataPrecision do
12
- Ustaw skalę danych do
2
- Kliknij
OK
Przeciągnij i upuść Data Flow task
na przepływ sterowania i nazwij go jako File to database - With Cedilla delimiter
. Wyłącz pierwsze zadanie przepływu danych.
Skonfiguruj drugie zadanie przepływu danych za pomocą Flat File Source
i OLE DB Destination
Kliknij dwukrotnie Źródło plików płaskich, aby otworzyć Flat File Source Editor
. W Connection Managers
strona Edytora źródeł plików płaskich , wybierz Menedżera połączeń plików płaskich ProductListPrice_Cedilla
i kliknij Kolumny stronę, aby skonfigurować kolumny. Kliknij OK
.
Wykonaj pakiet. Wszystkie składniki będą wyświetlane w kolorze zielonym, co oznacza, że proces zakończył się sukcesem, ale żadne wiersze nie zostaną przetworzone. Widać, że między Flat File Source
nie ma wskazania numerów wierszy i OLE DB Destination
Kliknij Progress
i zobaczysz następujący komunikat ostrzegawczy.
[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.