2017-03-10 2 views
0

J'ai un fichier.txt d'élaborer avec ODI qui se compose de plusieurs enregistrements avec la structure suivante:ODI - Travailler avec file.txt structuré (père record et ses fils)

  • Heather Record (père)
    • fiche de type 1 (fils)
    • type d'enregistrement 2 (fils)
    • fiche de type 1 ... n (fils)
    • fiche type 2 ... n (fils)
  • Pied de page Fiche 1

  • Heather Record (father1)

    • enregistrement de type 1 (fils)
    • type d'enregistrement 2 (fils)
    • type d'enregistrement 1 ... n (fils)
    • type d'enregistrement 2 ... n (fils)
  • Footer Record 2

Chaque enregistrement contient un ensemble de champs communs après lesquels chacun a sa propre structure. Pour cette raison, je dois créer plusieurs tables dans ma base de données pour chaque type d'enregistrement et une table de faits qui stocke le ralationhip entre chaque enregistrement. Ce faisant, je ne sais pas comment garder la relation entre le père et les fils record. Est-il possible d'utiliser une fonction dans ODI pour faire cela? Est-il possible d'importer le fichier avec ODI et d'élaborer une sorte de système hiérarchique?

Répondre

0

Vous pouvez envisager une importation préliminaire dans une table temporaire où, en fonction du type de ligne (en-tête, type1 fils, type2 fils ou pied de page), vous remplissez deux nouvelles colonnes RECORD_ID et ROW_TYPE.

  1. RECORD_ID serait peuplée par une séquence, en utilisant nextVal() lorsque le type de ligne est en-tête et lastVal() dans les autres cas.

  2. ROW_TYPE serait rempli avec le type de ligne.

De cette façon, vous pourriez plus tard remplir vos tables en fonction de la valeur de ROW_TYPE, la préservation de la relation entre le père et fils dans la colonne RECORD_ID.

Modifier (plus explaination)

Disons que les lignes de vos fichiers ont la structure suivante

Header: Field1;Field2;Field3 
Type1: Field1;Field2 
Type2: Field1;Field2;Field3;Field4 
Footer: Field1;Field2 

Ensuite, vos tables cibles nécessiterait une colonne pour chaque champ de la ligne de fichier correspondant, plus un pour l'ID.Ils ressembleraient cette

Header 
ID | Header col1 | Header col2 | Header col3 

Type1 
ID | Type1 col1 | Type1 col2 

Type2 
ID | Type2 col1 | Type2 col2 | Type2 col3 | Type2 col4 

Footer 
ID | Footer col1 | Footer col2 

Ensuite, votre table temporaire aurait 6 colonnes (5 à partir de la table qui a plus, plus un pour le Type) et se présente comme suit

Temp 
Type | ID | Temp col1 | Temp col2 | Temp col3 | Temp col4 

Avec cette structure , vous pouvez avoir une première interface qui charge chaque ligne du fichier dans la table, en mettant dans la colonne Type une valeur différente selon la ligne que vous analysez, et l'appel approprié à la séquence (nextVal() ou lastVal()) dans le ID colonne.

Temp interface 

Type <- rowType 
ID <- case when rowType = Header then sequence.nextVal() else sequence.lastVal() end 
Temp col1 <- File field1 
Temp col2 <- File field2 
Temp col3 <- File field3 
Temp col4 <- File field4 

Ensuite, vous pouvez avoir plusieurs interfaces de cette table temporaire peupleraient une table cible chacun, le filtrage sur la colonne Type.

Header interface 

ID <- ID 
Header col1 <- Temp col1 
Header col2 <- Temp col2 
Header col3 <- Temp col3 
where Type = 'Header' 
+0

Cette solution pourrait fonctionner! Mais, une fois que j'ai créé la table t1 (RECORD_ID, ROW_TYPE), comment puis-je remplir la colonne RECORD_ID en utilisant ODI? Est-il possible de peupler les deux colonnes en même temps? parce que je dois d'abord connaître la valeur de la colonne type de ligne pour remplir les champs RECORD_ID –

+0

Désolé, ma réponse n'était pas claire du tout ... Je l'ai édité avec des explications supplémentaires, j'espère que ma solution s'applique à votre cas. –