Å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.
På 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
På Columns
siden i Flat File Connection Manager Editor , skal du kontrollere, at Column delimiter
er tom og deaktiveret. Klik på Advanced
side.
På 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.
På 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 ProductListPrice på Connection Managers
fanen i bunden af pakken.
Træk og slip Data Flow Task
på Kontrolflow 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
på Dataflow fanen. 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
og klik på Kolonner side.
På Columns
side i Flat File Source Editor , tjek kolonnen LineData
og klik på OK
.
Træk og slip en Script Component
på 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 kolonner på Script Transformation Editor og vælg LineData
kolonne. Klik på Indgange og udgange side.
På 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
På 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
På 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 , metodenFlatFileInput_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
på 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
.
På 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
På 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
På 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
På 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 task
på Kontrolflow 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.