Causa:
SSIS non riesce a leggere il file e visualizza il seguente avviso a causa del delimitatore di colonna Ç
("c" con cedilla ) e not
a causa del delimitatore di riga {LF}
(Avanzamento riga ).
[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.
Ecco un pacchetto SSIS di esempio che mostra come risolvere il problema utilizzando Script Component
e alla fine c'è un altro esempio che simula il tuo problema.
Risoluzione:
Di seguito il pacchetto di esempio è scritto in SSIS 2008 R2
. Legge un file flat con delimitatore di riga {LF}
come valore di una singola colonna; quindi divide i dati utilizzando Script Component
per inserire le informazioni in una tabella in SQL Server 2008 R2
banca dati.
Usa Notepad++
per creare un semplice file flat con poche righe. Il file di esempio seguente ha ID prodotto e Prezzo di listino informazioni su ogni riga separate da Ç
come delimitatore di colonna e ogni riga termina con {LF}
delimitatore.
In Notepad++, fai clic su Encoding
e quindi fare clic su Encoding in UTF-8
per salvare il file flat in UTF-8
codifica.
L'esempio utilizzerà un SQL Server 2008 R2
database denominato Sora
. Crea una nuova tabella denominata dbo.ProductListPrice
utilizzando lo script indicato di seguito. SSIS inserirà i dati del file flat in questa tabella.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Crea un pacchetto SSIS utilizzando Business Intelligence Development Studio (BIDS) 2008 R2 . Assegna un nome al pacchetto come SO_6268205.dtsx
. Crea un'origine dati denominata Sora.ds
per connettersi al database Sora
in SQL Server 2008 R2 .
Fare clic con il pulsante destro del mouse in un punto qualsiasi all'interno del pacchetto, quindi fare clic su Variables
per visualizzare il riquadro delle variabili. Crea una nuova variabile denominata ColumnDelimiter
di tipo di dati String
nell'ambito del pacchetto SO_6268205
e imposta la variabile con il valore Ç
Fare clic con il pulsante destro del mouse su Connection Managers
e fare clic su New Flat File Connection...
per creare una connessione per leggere il file flat.
Sul General
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:
- Imposta nome gestore connessione a
ProductListPrice
- Imposta Descrizione a
Flat file connection manager to read product list price information.
- Seleziona il percorso del file flat. Ho il file nel percorso
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
- Seleziona
{LF}
da Delimitatore di riga dell'intestazione - Controlla
Column names in the first data row
- Fai clic su
Columns
pagina
Nelle Columns
pagina dell'Editor Flat File Connection Manager , verifica che il Column delimiter
è vuoto e disabilitato. Fai clic su Advanced
pagina.
Su Advanced
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni.
- Imposta il Nome a
LineData
- Verifica che il Delimitatore di colonna è impostato su
{LF}
- Imposta il Tipo di dati a
Unicode string [DT_WSTR]
- Imposta OutputColumnWidth a
255
- Fai clic su
Preview
pagina.
Nell'Preview
pagina dell'Editor Flat File Connection Manager , verifica che i dati visualizzati siano corretti e fai clic su OK
.
Vedrai l'origine dati Sora e il gestore di connessione file flat ProductListPrice sui Connection Managers
scheda nella parte inferiore del pacchetto.
Trascina e rilascia Data Flow Task
nel Flusso di controllo scheda del pacchetto e denominalo come File to database - Without Cedilla delimiter
Fare doppio clic su Attività flusso di dati per passare la vista al Data Flow
scheda sul pacchetto. Trascina e rilascia un Flat File Source
nel Flusso di dati scheda. Fare doppio clic su Sorgente file flat per aprire Flat File Source Editor
.
In Connection Managers
pagina dell'Editor sorgente file flat , seleziona Gestione connessione file flat ProductListPrice
e fai clic su Colonne pagina.
Nelle Columns
pagina dell'Editor sorgente file flat , controlla la colonna LineData
e fai clic su OK
.
Trascina e rilascia un Script Component
nel Flusso di dati scheda sotto la Fonte file flat , seleziona Transformation
e fai clic su OK
. Collega la freccia verde da Fonte file flat a Componente di script . Fare doppio clic su Componente script per aprire Script Transformation Editor
.
Fai clic su Colonne di input su Editor trasformazione script e seleziona LineData
colonna. Fai clic su Ingressi e uscite pagina.
Su Inputs and Outputs
pagina dell'Editor trasformazione script , esegui le seguenti azioni.
- Cambia il nome degli input in FlatFileInput
- Cambia il nome delle uscite in
SplitDataOutput
- Seleziona Colonne di output e fai clic su
Add Column
. Ripeti l'operazione per aggiungere un'altra colonna. - Nomina la prima colonna
ProductId
- Imposta il Tipo di dati della colonna ProductId a
Unicode string [DT_WSTR]
- Imposta la Lunghezza a
30
Su Inputs and Outputs
pagina dell'Editor trasformazione script , esegui le seguenti azioni.
- Nomina la seconda colonna
ListPrice
- Imposta il Tipo di dati della colonna PrezzoLista a
numeric [DT_NUMERIC]
- Imposta la Precisione a
12
- Imposta la Scala a
2
- Fai clic su Script pagina per modificare lo script
Nello Script
pagina dell'Editor trasformazione script , esegui le seguenti azioni.
- Fai clic sul pulsante con i puntini di sospensione su ReadOnlyVariables e seleziona la variabile
User::ColumnDelimiter
- Fai clic su
Edit Script...
Incolla il seguente C# nell'editor di script. Lo script esegue le seguenti attività.
- Utilizzo del valore del delimitatore di colonna
Ç
definito nella variabile Utente::ColumnDelimiter , il metodoFlatFileInput_ProcessInputRow
divide il valore in ingresso e lo assegna alle due colonne di output definite nella trasformazione Componente script.
Codice componente script 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]);
}
}
Trascina e rilascia OLE DB Destination
nel Flusso di dati scheda. Collega la freccia verde da Componente script a Destinazione OLE DB . Fare doppio clic su Destinazione OLE DB per aprire OLE DB Destination Editor
.
In Connection Managers
pagina dell'Editor di destinazione OLE DB , esegui le seguenti azioni.
- Seleziona
Sora
da Gestione connessioni OLE DB - Seleziona
Table or view - fast load
da Modalità di accesso ai dati - Seleziona
[dbo].[ProductListPrice]
da Nome della tabella o della vista - Fai clic su Mapping pagina
Fai clic su Mappings
pagina nell'Editor di destinazione OLE DB mapperebbe automaticamente le colonne se i nomi delle colonne di input e output sono gli stessi. Fare clic su OK
.
Flusso di dati la scheda dovrebbe essere simile a questa dopo aver configurato tutti i componenti.
Esegui la query select * from dbo.ProductListPrice
in SQL Server Management Studio (SSMS) per trovare il numero di righe nella tabella. Dovrebbe essere vuoto prima di eseguire il pacchetto.
Esegui il pacchetto. Noterai che il pacco è stato elaborato correttamente 9 righe. Il file flat contiene 10 righe ma la prima riga è l'intestazione con i nomi delle colonne.
Esegui la query select * from dbo.ProductListPrice
in SQL Server Management Studio (SSMS) per trovare il 9 righe inserite correttamente nella tabella. I dati devono corrispondere ai dati del file flat.
L'esempio precedente ha illustrato come dividere manualmente i dati utilizzando Componente script perché Gestione connessione file flat incontra un errore durante la configurazione del delimitatore di colonna Ç
Simulazione problema:
Questo esempio mostra un Gestione connessioni file flat separato configurato con delimitatore di colonna Ç
, che viene eseguito ma incontra un avviso e non elabora alcuna riga.
Fare clic con il pulsante destro del mouse su Connection Managers
e fare clic su New Flat File Connection...
per creare una connessione per leggere il file flat. Sul General
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:
- Imposta nome gestore connessione a
ProductListPrice_Cedilla
- Imposta la descrizione su
Flat file connection manager with Cedilla column delimiter.
- Ho il file nel percorso
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
Seleziona il percorso del file flat. - Seleziona
{LF}
da Delimitatore di riga dell'intestazione - Controlla
Column names in the first data row
- Fai clic su
Columns
pagina
Nelle Columns
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:
- Imposta Delimitatore di riga a
{LF}
- Il campo delimitatore di colonna potrebbe essere disabilitato. Fai clic su
Reset Columns
- Imposta Delimitatore di colonna a
Ç
- Fai clic su
Advanced
pagina
Su Advanced
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:
- Imposta il Nome a
ProductId
- Imposta il ColumnDelimiter a
Ç
- Imposta il Tipo di dati a
Unicode string [DT_WSTR]
- Imposta la Lunghezza a
30
- Fai clic sulla colonna
ListPrice
Su Advanced
pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:
- Imposta il Nome a
ListPrice
- Imposta il ColumnDelimiter a
{LF}
- Imposta il Tipo di dati a
numeric [DT_NUMERIC]
- Imposta DataPrecision a
12
- Imposta DataScale a
2
- Fai clic su
OK
Trascina e rilascia un'Data Flow task
nel Flusso di controllo scheda e denominalo come File to database - With Cedilla delimiter
. Disabilita la prima attività del flusso di dati.
Configura la seconda attività del flusso di dati con Flat File Source
e OLE DB Destination
Fare doppio clic sulla sorgente file flat per aprire Flat File Source Editor
. In Connection Managers
pagina dell'Editor sorgente file flat , seleziona Gestione connessione file flat ProductListPrice_Cedilla
e fai clic su Colonne pagina per configurare le colonne. Fare clic su OK
.
Esegui il pacchetto. Tutti i componenti visualizzeranno il colore verde per indicare che il processo è andato a buon fine ma nessuna riga verrà elaborata. Puoi vedere che non ci sono indicazioni di numeri di righe tra il Flat File Source
e OLE DB Destination
Fai clic su Progress
scheda e noterai il seguente messaggio di avviso.
[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.