J'essaie d'importer des données d'un fichier plat encodé en utf-8 dans SQL Server 2008 à l'aide de SSIS. Voici à quoi ressemble la fin des données de ligne dans Notepad ++:
J'ai quelques images supplémentaires montrant à quoi ressemble le gestionnaire de connexion de fichiers:
Vous pouvez voir que les données s'affichent correctement dans l'aperçu du gestionnaire de connexions de fichiers. Lorsque j'essaie d'importer ces données, aucune ligne n'est importée. J'obtiens un message d'erreur indiquant que le délimiteur de ligne est introuvable. Vous pouvez voir dans les images du gestionnaire de connexions de fichiers que le délimiteur de ligne d'en-tête et le délimiteur de ligne sont tous deux définis sur {LF}
. C'était suffisant pour générer l'aperçu correct, donc je ne comprends pas pourquoi cela n'a pas fonctionné pour importer. J'ai essayé un certain nombre de choses qui n'ont donné aucun résultat:
[Source de fichier plat [582]] Avertissement: la fin du fichier de données a été atteinte lors de la lecture des lignes d'en-tête. Assurez-vous que le délimiteur de lignes d'en-tête et le nombre de lignes d'en-tête à ignorer sont corrects.
Merci d'avoir regardé cela et j'apprécie vraiment toute aide que vous pouvez offrir.
SSIS ne parvient pas à lire le fichier et affiche l'avertissement ci-dessous en raison du délimiteur de colonne Ç
( "c" avec cédille) et not
en raison du délimiteur de ligne {LF}
( Saut de ligne).
[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.
Voici un exemple de package SSIS qui montre comment résoudre le problème à l'aide de Script Component
et à la fin il y a un autre exemple qui simule votre problème.
L'échantillon ci-dessous est écrit en SSIS 2008 R2
. Il lit un fichier plat avec un délimiteur de ligne {LF}
en tant que valeur de colonne unique; divise ensuite les données à l'aide de Script Component
pour insérer les informations dans un tableau dans SQL Server 2008 R2
base de données.
Utilisez Notepad ++ pour créer un fichier plat simple avec quelques lignes. L'exemple de fichier ci-dessous contient ID produit et Prix catalogue des informations sur chaque ligne séparées par Ç
comme délimiteur de colonne et chaque ligne se termine par {LF}
délimiteur.
Sur le Bloc-notes ++, cliquez sur Encoding
puis cliquez sur Encoding in UTF-8
pour enregistrer le fichier plat dans UTF-8
encodage.
L'échantillon utilisera un SQL Server 2008 R2
base de données nommée Sora
. Créez une nouvelle table nommée dbo.ProductListPrice
en utilisant le script ci-dessous. SSIS insérera les données du fichier plat dans ce tableau.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Créez un package SSIS à l'aide de Business Intelligence Development Studio (BIDS) 2008 R2. Nommez le package comme SO_6268205.dtsx
. Créez une source de données nommée Sora.ds
pour se connecter à la base de données Sora
dans SQL Server 2008 R2.
Cliquez avec le bouton droit n'importe où dans le package, puis cliquez sur Variables
pour afficher le volet des variables. Créez une nouvelle variable nommée ColumnDelimiter
de type de données String
dans la portée du package SO_6268205
et définissez la variable avec la valeur Ç
Faites un clic droit sur le Connection Managers
et cliquez sur New Flat File Connection...
pour créer une connexion pour lire le fichier plat.
Sur la page General
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes:
ProductListPrice
Flat file connection manager to read product list price information.
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
{LF}
de Délimiteur de ligne d'en-têteColumn names in the first data row
Columns
pageSur la page Columns
de l'éditeur Flat File Connection Manager, vérifiez que le Column delimiter
est vide et désactivé. Cliquez sur Advanced
page.
Sur la page Advanced
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes.
LineData
{LF}
Unicode string [DT_WSTR]
255
Preview
.Sur la page Preview
de l'éditeur Flat File Connection Manager, vérifiez que les données affichées sont correctes et cliquez sur OK
.
Vous verrez la source de données Sora et le gestionnaire de connexion de fichiers plats ProductListPrice sur le Connection Managers
onglet en bas de l'emballage.
Glisser déposer Data Flow Task
sur l'onglet Control Flow du package et nommez-le File to database - Without Cedilla delimiter
Double-cliquez sur Tâche de flux de données pour basculer la vue sur Data Flow
onglet sur le paquet. Faites glisser et déposez un Flat File Source
dans l'onglet Flux de données. Double-cliquez sur Flat File Source pour ouvrir Flat File Source Editor
.
Sur le Connection Manager
page de Flat File Source Editor, sélectionnez Flat File Connection ManagerProductListPrice
et cliquez Colonnes page.
Sur la page Columns
de l'éditeur Flat File Source Editor, vérifiez la colonne LineData
et cliquez sur OK
.
Faites glisser et déposez un Script Component
sur l'onglet Flux de données sous le Source du fichier plat, sélectionnez Transformation
et cliquez sur OK
. Connectez la flèche verte de Source de fichier plat à Composant de script. Double-cliquez sur Composant de script pour ouvrir Script Transformation Editor
.
Cliquez sur Colonnes d'entrée sur Éditeur de transformation de script et sélectionnez la colonne LineData
. Cliquez sur Entrées et sorties page.
Sur le Inputs and Outputs
page de Script Transformation Editor, effectuez les actions suivantes.
SplitDataOutput
Add Column
. Répétez cette opération pour ajouter une autre colonne.ProductId
Unicode string [DT_WSTR]
30
Sur le Inputs and Outputs
page de l'éditeur Script Transformation Editor, effectuez les actions suivantes.
ListPrice
numeric [DT_NUMERIC]
12
2
Sur la page Script
de Éditeur de transformation de script, effectuez les actions suivantes.
User::ColumnDelimiter
Edit Script...
Collez le C # ci-dessous dans l'éditeur de script. Le script effectue les tâches suivantes.
Ç
défini dans la variable User :: ColumnDelimiter, la méthode FlatFileInput_ProcessInputRow
divise la valeur entrante et l'affecte aux deux colonnes de sortie définies dans la transformation Composant de script.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]);
}
}
Faites glisser et déposez OLE DB Destination
dans l'onglet Flux de données. Connectez la flèche verte de Composant de script à Destination OLE DB. Double-cliquez sur Destination OLE DB pour ouvrir OLE DB Destination Editor
.
Sur le Connection Manager
page de Éditeur de destination OLE DB, effectuez les actions suivantes.
Sora
dans OLE DB Connection ManagerTable or view - fast load
de Mode d'accès aux données[dbo].[ProductListPrice]
de Nom de la table ou de la vueCliquez sur la page Mappings
dans Éditeur de destination OLE DB mapperait automatiquement les colonnes si les noms des colonnes d'entrée et de sortie sont identiques. Cliquez sur OK
.
Data Flow tab devrait ressembler à ceci après avoir configuré tous les composants.
Exécutez la requête select * from dbo.ProductListPrice
dans le SQL Server Management Studio (SSMS) pour trouver le nombre de lignes dans le tableau. Il doit être vide avant d'exécuter le package.
Exécutez le package. Vous remarquerez que le package a correctement traité 9 lignes. Le fichier plat contient 10 lignes mais la première ligne est un en-tête avec des noms de colonne.
Exécutez la requête select * from dbo.ProductListPrice
dans le SQL Server Management Studio (SSMS) pour trouver les 9 lignes correctement insérées dans la table. Les données doivent correspondre aux données de fichier plat.
L'exemple ci-dessus montre comment fractionner manuellement les données à l'aide de Composant de script car l'erreur Gestionnaire de connexion de fichiers plats rencontre l'erreur lors de la configuration du délimiteur de colonne Ç
Cet exemple montre un Flat File Connection Manager séparé configuré avec un délimiteur de colonne Ç
, qui s'exécute mais rencontre un avertissement et ne traite aucune ligne.
Faites un clic droit sur le Connection Managers
et cliquez sur New Flat File Connection...
pour créer une connexion pour lire le fichier plat. Sur la page General
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes:
ProductListPrice_Cedilla
Flat file connection manager with Cedilla column delimiter.
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
Sélectionnez le chemin du fichier plat.{LF}
de Délimiteur de ligne d'en-têteColumn names in the first data row
Columns
pageSur la page Columns
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes:
{LF}
Reset Columns
Ç
Advanced
pageSur la page Advanced
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes:
ProductId
Ç
Unicode string [DT_WSTR]
30
ListPrice
Sur la page Advanced
de l'éditeur Flat File Connection Manager, effectuez les actions suivantes:
ListPrice
{LF}
numeric [DT_NUMERIC]
12
2
OK
Faites glisser et déposez un Data Flow task
sur l'onglet Control Flow et nommez-le comme File to database - With Cedilla delimiter
. Désactivez la première tâche de flux de données.
Configurez la deuxième tâche de flux de données avec Flat File Source
et OLE DB Destination
Double-cliquez sur la source du fichier plat pour ouvrir Flat File Source Editor
. Sur le Connection Manager
page de l'éditeur Flat File Source Editor, sélectionnez Flat File Connection ManagerProductListPrice_Cedilla
et cliquez sur Colonnes page pour configurer les colonnes. Cliquez sur OK
.
Exécutez le package. Tous les composants afficheront une couleur verte pour indiquer que le processus a réussi, mais aucune ligne ne sera traitée. Vous pouvez voir qu'il n'y a pas d'indication de numéros de lignes entre les Flat File Source
et OLE DB Destination
Cliquez sur l'onglet Progress
et vous remarquerez le message d'avertissement suivant.
[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.
La réponse ci-dessus semble terriblement compliquée, il suffit de convertir les fins de ligne dans le fichier
Dim FileContents As String = My.Computer.FileSystem.ReadAllText("c:\Temp\UnixFile.csv")
Dim NewFileContents As String = FileContents.Replace(vbLf, vbCrLf)
My.Computer.FileSystem.WriteAllText("c:\temp\WindowsFile.csv", NewFileContents, False, New System.Text.UnicodeEncoding)
Rehashed from here
Ce problème se pose également si vous essayez de consommer FlatFile généré sur une plate-forme différente comme Unix, Mac, etc. via SSIS sur Windows
Dans un tel scénario, tout ce que vous devez faire est de convertir le format de fichier de disons UNIX en DOS avec la commande unix2dos
unix2dos file-to-convert