2017-09-22 4 views
0

J'ai un certain nombre de fichiers texte dans un répertoire qui ont un numéro de série de colonnes [6] séparés par des onglets. J'ai lu ceci dans un paquetage SSIS en utilisant un bloc 'Flat File Source'. Si un fichier contient plus de colonnes que le nombre requis ou si des données sont manquantes dans l'une des colonnes, je souhaite rejeter ce fichier.SSIS - Nombre fixe de colonnes dans la source de fichier plat

je l'ai fait quelques tests avec divers exemples de fichiers. Chaque fois que j'ajoute des colonnes supplémentaires, le programme accepte ces fichiers. Il jette une erreur quand il y a moins de colonnes ce qui est bien.

Mais, est-il un moyen de spécifier que le fichier doit avoir une certaine quantité de colonnes et que les données doivent être présents dans chaque colonne?

Je n'ai pas beaucoup d'expérience avec SSIS donc je vous serais reconnaissant de toute suggestion.

Merci

Répondre

1

Je voudrais utiliser une tâche de script pour ce faire.

Vous pouvez utiliser System.IO.StreamReader pour ouvrir le fichier et lire votre ligne d'en-tête, puis effectuer la validation dont vous avez besoin sur la chaîne résultante.

Je voudrais également créer une variable booléenne dans le package SSIS, appelée quelque chose comme 'FileIsValid', à laquelle j'écrirais (de la tâche de script) True si les conditions sont remplies, et False si elles ne le sont pas. Je l'utiliserais ensuite pour diriger le flux du paquet en utilisant des contraintes de précédence.

Quelque chose comme ceci:

public void Main() 
{ 
    System.IO.StreamReader reader = null; 

    try 
    { 
     Dts.Variables["User::FileIsValid"].Value = false; 

     reader = new System.IO.StreamReader(Dts.Variables["User::Filepath"].Value.ToString()); 

     string header = reader.ReadLine(); 

     if (header.Trim() == "Column1\tColumn2\tColumn3\tColumn4\tColumn5\tColumn6") 
      Dts.Variables["User::FileIsValid"].Value = true; 

     reader.Close(); 
     reader.Dispose(); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    catch 
    { 
     if (reader != null) 
     { 
      reader.Close(); 
      reader.Dispose(); 
     } 

     throw; 
    } 
} 

En ce qui concerne la vérification il existe des données dans toutes les colonnes, est-ce besoin d'être pour chaque ligne?

Vous pouvez continuer à lire les lignes avec StreamReader et utiliser des expressions régulières pour vérifier quelque chose comme ça.

0

Développant Chris Mack:

Si les fichiers ne sont pas les en-têtes que vous pouvez faire un compte.

char[] delim = new char[] {'\t'}; 
if(header.Split(delim).Length() == 5) 
...