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++:

enter image description here

j'ai encore quelques images montrant à quoi ressemble le gestionnaire de connexion de fichiers:

enter image description here

enter image description here

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.

28
demandé sur K Richard 2011-06-07 20:04:40

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.

Flat file source

sur le bloc-notes++, cliquez Encoding puis cliquez sur Encoding in UTF-8 pour sauvegarder le fichier flat dans UTF-8 l'encodage.

Encoding UTF-8

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 Ç

Package variables

clic-Droit sur le Connection Managers et cliquez sur New Flat File Connection... pour créer une connexion pour lire le fichier plat.

Flat File Connection

Sur le General page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:

  • Set nom du Gestionnaire de connexionProductListPrice
  • Set Description pour Flat file connection manager to read product list price information.
  • 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
  • Sélectionner {LF}Ligne D'En-Tête Délimiteur
  • Case Column names in the first data row
  • Cliquez sur Columns page

Flat File Connection Manager Editor - General

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.

Flat File Connection Manager Editor - Columns

Sur le Advanced page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes.

  • Set NomLineData
  • Vérifiez que le Colonne délimiteur est réglé sur {LF}
  • Set Type de donnéesUnicode string [DT_WSTR]
  • Set OutputColumnWidth255
  • cliquez sur le Preview page.

Flat File Connection Manager Editor - Advanced

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.

Flat File Connection Manager Editor - Preview

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.

Connection Managers

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

Data Flow Task 1

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.

Flat File Source Editor - Connection Manager

Sur le Columns page de l' Éditeur De Sources Flat File, cochez la colonne LineData et cliquez sur OK.

Flat File Source Editor - Columns

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.

Script Transformation Editor - Input Columns

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 ProductIdUnicode string [DT_WSTR]
  • Set Longueur30

Script Transformation Editor - Inputs and Outputs - ProductId

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 ListPricenumeric [DT_NUMERIC]
  • Set Précision12
  • Set Échelle pour 2
  • Cliquez sur Script la page pour modifier le script

Script Transformation Editor - Inputs and Outputs - ListPrice

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...

Script Transformation Editor - 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éthode FlatFileInput_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]);
    }
}

Script Component Code - C#

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 SoraGestionnaire de connexions OLE DB
  • Sélectionner Table or view - fast loadmode d'accès aux Données
  • Sélectionner [dbo].[ProductListPrice]Nom de la table ou de la vue.
  • Cliquez sur Mappages page

OLE DB Destination Editor - Connection Manager

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.

OLE DB Destination Editor - Mappings

Flux De Données tab devrait ressembler à quelque chose comme ça après avoir configuré tous les composant.

Data Flow tab

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.

Rows in table before package execution

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.

Package execution without delimiter

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.

Rows in table after package execution

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 connexionProductListPrice_Cedilla
  • New Flat File Connection... définir la Description à Flat file connection manager with Cedilla column delimiter.
  • 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

Flat File Connection Manager Editor - With Cedilla - General

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

Flat File Connection Manager Editor - With Cedilla - Columns

Sur le Advanced page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les opérations suivantes actions:

  • Set NomProductId
  • Set ColumnDelimiterÇ
  • Set Type de donnéesUnicode string [DT_WSTR]
  • Set Longueur30
  • Cliquez sur la colonne ListPrice

Flat File Connection Manager Editor - With Cedilla - Advanced - ProductId

Sur Advanced page de l' Fichier Plat Éditeur Du Gestionnaire De Connexions, effectuer les actions suivantes:

  • Set NomListPrice
  • Set ColumnDelimiter{LF}
  • Set Type de donnéesnumeric [DT_NUMERIC]
  • Set DataPrecision pour 12
  • Set DataScale2
  • Cliquez sur OK

Flat File Connection Manager Editor - With Cedilla - Advanced - ListPrice

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.

Data Flow Task 2

configurer le second flux de données la tâche Flat File Source et OLE DB Destination

Data Flow Tab - 2

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.

Flat File Source Editor - Cedilla

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

Package Execution - Cedilla

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.

Progress Warning message

59
répondu Ja͢ck 2013-02-20 03:29:42

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

0
répondu Richard 2016-08-10 12:49:46

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
0
répondu Jeevan 2016-10-23 08:58:08