Pourquoi le SSIS ne reconnaît-il pas le délimiteur de ligne {LF} row lors de l'importation de fichiers plats UTF-8?
j'essaie d'importer des données d'un fichier plat encodé utf-8 dans SQL Server 2008 en utilisant SSIS. Voici à quoi ressemble la fin de la ligne de données dans Notepad++:
j'ai encore quelques images 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 connexion de fichiers. Lorsque j'essaie d'importer ces données, pas de les lignes d'importation. Je reçois un message d'erreur indiquant que le délimiteur de ligne n'a pas été trouvé. Vous pouvez voir dans les images du gestionnaire de connexion de fichiers que le délimiteur de ligne d'en-tête et le délimiteur de ligne sont tous deux définis à {LF}
. Cela a été suffisant pour générer la prévisualisation correcte, donc je suis perdu à la raison pour laquelle il n'a pas fonctionné à importer. J'ai essayé un certain nombre de choses qui ont apporté des résultats nuls:
- essayé d'utiliser L'importation de magicien dans SSMS...même des résultats
- essayé d'utiliser les données la conversion, aucun impact
- essayé de définir le délimiteur de ligne à (0a), mêmes résultats
[Source De Fichier Plat [582]] Avertissement: Les fin du fichier de données a été atteint tandis que la lecture des lignes d'en-tête. Assurez-vous que le en-tête délimiteur de ligne et le nombre de les lignes d'en-tête à sauter sont correctes.
Merci pour regarder et j'ai vraiment apprécier l'aide que vous pouvez offrir.
3 réponses
Cause:
SSIS ne lit pas le fichier et affiche l'avertissement ci-dessous en raison du délimiteur de colonne Ç
( " c " avec cedilla et not
en raison de la 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 paquet SSIS qui montre comment résoudre le problème en utilisant Script Component
et à la fin il y a un autre exemple qui simule votre question.
résolution:
ci-dessous l'exemple de paquet est écrit en SSIS 2008 R2
. Il lit un fichier plat avec délimiteur de ligne {LF}
comme valeur d'une seule colonne; puis divise les données en utilisant Script Component
pour insérer l'information dans un tableau dans SQL Server 2008 R2
base de données.
Utiliser Notepad++ créer un simple fichier plat avec quelques lignes. Ci-dessous l'exemple de fichier a Numéro Du Produit et Liste Prix information sur chaque ligne séparée par Ç
comme délimiteur de colonne et chaque ligne se termine par {LF}
délimiteur.
sur le bloc-notes++, cliquez Encoding
puis cliquez sur Encoding in UTF-8
pour sauvegarder le fichier flat dans UTF-8
l'encodage.
l'échantillon utilisera un SQL Server 2008 R2
base de données nommé 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éer un paquet SSIS en utilisant Business Intelligence Development Studio (BIDS) 2008 R2. Nom du paquet SO_6268205.dtsx
. Créer une source de données nommée Sora.ds
pour vous connecter à la base de données Sora
SQL Server 2008 R2.
cliquez avec le bouton droit de la souris n'importe où dans le paquet, puis cliquez sur Variables
pour voir le volet des variables. Créez une nouvelle variable nommée ColumnDelimiter
du type de données String
dans le paquet scope SO_6268205
et définissez la variable avec la valeur Ç
clic-Droit sur le Connection Managers
et cliquez sur New Flat File Connection...
pour créer une connexion pour lire le fichier plat.
Sur le General
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:
- Set nom du Gestionnaire de connexion
ProductListPrice
- Set Description pour
Flat file connection manager to read product list price information.
- Sélectionner
{LF}
Ligne D'En-Tête Délimiteur - Case
Column names in the first data row
- Cliquez sur
Columns
page
New Flat File Connection...
sélectionnez le chemin du fichier plat. J'ai le fichier dans le chemin d'accès C:\Siva\StackOverflow\Files68205\ProductListPrice.txt
Sur le Columns
page de l' Fichier Plat Editeur Du Gestionnaire De Connexion, vérifiez que le Column delimiter
est vide et désactivé. Cliquez sur Advanced
page.
Sur le Advanced
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes.
- Set Nom
LineData
- Vérifiez que le Colonne délimiteur est réglé sur
{LF}
- Set Type de données
Unicode string [DT_WSTR]
- Set OutputColumnWidth
255
- cliquez sur le
Preview
page.
Sur le Preview
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, vérifier que les données affichées semblent correctes et cliquez sur OK
.
vous verrez la source de données Sora et le fichier plat gestionnaire de connexion ProductListPrice sur le Connection Managers
onglet au bas de l'emballage.
faites Glisser et déposez Data Flow Task
sur le Flux De Contrôle onglet du paquet et nom File to database - Without Cedilla delimiter
Double-cliquez sur le Tâche De Flux De Données pour changer la vue vers le Data Flow
onglet sur le paquet. Faites glisser et déposez un Flat File Source
sur le Flux De Données onglet. Double-cliquez sur le Source De Fichier Plat ouvrir Flat File Source Editor
.
Sur le Connection Manager
page de l' Fichier Plat L'Éditeur De Code Source, sélectionnez Plat Gestionnaire De Connexions De FichiersProductListPrice
et cliquez sur Colonnes page.
Sur le Columns
page de l' Éditeur De Sources Flat File, cochez la colonne LineData
et cliquez sur OK
.
faites Glisser et déposez un Script Component
sur Flux De Données onglet en dessous du Source De Fichier Plat, sélectionnez Transformation
et cliquez sur OK
. Connectez la flèche verte de Source De Fichier PlatComposant Script. Double-cliquez sur Composant Script ouvrir Script Transformation Editor
.
Cliquez sur Colonnes D'EntréeÉditeur De Transformation De Script et sélectionnez LineData
colonne. Cliquez sur entrées et sorties page.
Sur le Inputs and Outputs
page de l' Éditeur De Transformation De Script, effectuer les actions suivantes.
- Modifier les entrées de nom de FlatFileInput
- changer le nom des sorties en
SplitDataOutput
- Sélectionner Colonnes De Sortie et cliquez sur
Add Column
. Répétez cette opération pour ajouter une autre colonne. - Nom de la première colonne
ProductId
- Set Type de données de la colonne ProductId
Unicode string [DT_WSTR]
- Set Longueur
30
Sur le Inputs and Outputs
page de la Éditeur De Transformation De Script, effectuer les actions suivantes.
- nommer la deuxième colonne
ListPrice
- Set Type de données de la colonne ListPrice
numeric [DT_NUMERIC]
- Set Précision
12
- Set Échelle pour
2
- Cliquez sur Script la page pour modifier le script
Sur le Script
page de l' Éditeur De Transformation De Script, effectuer les actions suivantes.
- cliquez sur le bouton ellipsis contre readonly variables et sélectionnez la variable
User::ColumnDelimiter
- Cliquez sur
Edit Script...
coller le C # ci-dessous dans L'éditeur de Script. Le script exécute les tâches suivantes.
- en utilisant la valeur de délimiteur de colonne
Ç
défini dans la variable Utilisateur::ColumnDelimiter la méthodeFlatFileInput_ProcessInputRow
divise la valeur entrante et l'assigne aux deux colonnes de sortie définies dans le composant Script transformation.
le code du composant Script en 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]);
}
}
faites Glisser et déposez OLE DB Destination
sur le Flux De Données onglet. Connectez la flèche verte de Composant Script OLE DB Destination. Double-cliquez sur OLE DB Destination ouvrir OLE DB Destination Editor
.
Sur le Connection Manager
page de l' OLE DB Destination Editor, effectuer les actions suivantes.
- Sélectionner
Sora
Gestionnaire de connexions OLE DB - Sélectionner
Table or view - fast load
mode d'accès aux Données - Sélectionner
[dbo].[ProductListPrice]
Nom de la table ou de la vue. - Cliquez sur Mappages page
Cliquez sur Mappings
page OLE DB Destination Editor mapperait automatiquement les colonnes si les noms des colonnes input et output sont les mêmes. Cliquez sur OK
.
Flux De Données tab devrait ressembler à quelque chose comme ça après avoir configuré tous les composant.
exécutez la requête select * from dbo.ProductListPrice
dans le SQL Server Management Studio (SSMS) pour trouver le nombre de lignes dans la table. Il doit être vide avant d'exécuter le paquet.
exécutez le paquet. Vous remarquerez que le colis traités avec succès 9 lignes. Le fichier plat contient 10 lignes, mais la première ligne est en-tête avec noms de colonne.
exécutez la requête select * from dbo.ProductListPrice
dans le SQL Server Management Studio (SSMS) pour trouver le 9 lignes insérées avec succès dans le tableau. Les données doivent correspondre aux données du fichier plat.
l'exemple ci-dessus illustre comment diviser manuellement les données en utilisant Composant Script parce que le Fichier Plat Gestionnaire De Connexion rencontre une erreur lors de la configuration du délimiteur de colonne Ç
Simulation De La Question:
cet exemple montre un Plat Gestionnaire De Connexions De Fichiers configuré avec le délimiteur de colonne Ç
, qui exécute mais rencontre un avertissement et ne traite aucune ligne.
clic-Droit sur le Connection Managers
et cliquez sur New Flat File Connection...
pour créer une connexion pour lire le fichier plat. Sur le General
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:
- Set nom du Gestionnaire de connexion
ProductListPrice_Cedilla
- j'ai le fichier dans le chemin d'accès
C:\Siva\StackOverflow\Files68205\ProductListPrice.txt
sélectionnez le chemin du fichier plat. - Sélectionner
{LF}
Ligne D'En-Tête Délimiteur - Case
Column names in the first data row
- Cliquez sur
Columns
page
New Flat File Connection...
définir la Description à Flat file connection manager with Cedilla column delimiter.
Sur le Columns
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:
- Set délimiteur de ligne pour
{LF}
- le champ délimiteur de colonne peut être désactivé. Cliquez sur
Reset Columns
- Set délimiteur de Colonne
Ç
- Cliquez sur
Advanced
page
Sur le Advanced
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les opérations suivantes actions:
- Set Nom
ProductId
- Set ColumnDelimiter
Ç
- Set Type de données
Unicode string [DT_WSTR]
- Set Longueur
30
- Cliquez sur la colonne
ListPrice
Sur Advanced
page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:
- Set Nom
ListPrice
- Set ColumnDelimiter
{LF}
- Set Type de données
numeric [DT_NUMERIC]
- Set DataPrecision pour
12
- Set DataScale
2
- Cliquez sur
OK
faites Glisser et déposez un Data Flow task
sur le Flux De Contrôle onglet et le nom File to database - With Cedilla delimiter
. Désactiver la première tâche de flux de données.
configurer le second flux de données la tâche Flat File Source
et OLE DB Destination
double-cliquez sur le fichier Flat Source pour ouvrir Flat File Source Editor
. Sur le Connection Manager
page de l' Éditeur De Sources Flat File, sélectionnez Plat Gestionnaire De Connexions De FichiersProductListPrice_Cedilla
et cliquez sur Colonnes la page pour configurer les colonnes. Cliquer OK
.
exécutez le paquet. Tous les composants afficheront la couleur verte pour indiquer que le processus a été un succès, mais aucune ligne ne sera traitée. Vous pouvez voir qu'il n'y a pas d'indication de nombre de lignes entre les Flat File Source
et OLE DB Destination
cliquez sur le Progress
tab et vous remarquerez le suivant le message d'avertissement.
[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.
réponse ci-dessus semble terriblement compliqué, 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)
Rabâchage de ici
cette question se pose également si vous essayez de consommer FlatFile généré sur une plateforme 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 Say UNIX à DOS avec la commande unix2dos
unix2dos file-to-convert