Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
Je voudrais charger un fichier Excel qui contient un tableau où une valeur d'un champ est répartie sur plusieurs lignes, du coup, lorsque je fais le chargement il prend la valeur de la première ligne et met vide pour les autres lignes.
H | C | ||||
traitement1 | H1 | OK | |||
Traitement2 | H2 | OK | |||
Traitement3 | H3 | OK | |||
H4 | OK | ||||
H5 | OK | ||||
H6 | OK | ||||
H7 | OK | ||||
H8 | OK | ||||
H9 | OK | ||||
H10 | OK | ||||
Traitement4 | H11 | OK |
j'ai essayé ce code:
load if(len(trim(B)>0,B,PREVIOUS(B)) as Traitement,
H,
C
from table;
le résultat donné: il répété seulement deux fois la valeur du champ "Traitement" et les autres lignes sont vides pour ce champ!
J'ai besoin de vos aides!
Merci d'avance
Il faut charger tous les onglets dans une table avec Concatenate puis ensuite utiliser la fonction peek sur la table contenant toutes les données.
Mais il y a plus simple en fait...
Lorsqu'on charge un fichier Excel avec l'assistant QV, à la seconde fenêtre, il est possible de transformer les données et notamment remplir les cellules vides.
Ensuite pour la boucle de lecture, je me base souvent sur le script suivant : http://community.qlik.com/docs/DOC-4452
Donc pour un fichier Book1.xlsx avec 3 onglets (Sheet1, Sheet2, Sheet3), on aurait le script suivant:
LET vStartSheetNumber = 1;
LET vEndSheetNumber = 3;
LET vExcelFileName = 'Book1';
// Generate Empty table
Data:
LOAD '' AS Field1
AutoGenerate(0);
FOR index = vStartSheetNumber TO vEndSheetNumber
Concatenate(Data)
LOAD *
FROM
[$(vExcelFileName).xlsx]
(ooxml, embedded labels, table is [Sheet$(index)], filters(Replace(1, top, StrCnd(null))));
NEXT
DROP Field Field1;
exit script;
Bonjour,
Il faut utiliser la fonction peek(), elle offre plus de possibilité que Previous() (Cf l'aide QV)
Voici un script qui marche (on part du principe que pour la première ligne, B est toujours renseigné)
Tb1:
LOAD * INLINE [
B, H, C
traitement1 , H1 , OK
Traitement2 , H2 , OK
Traitement3 , H3 , OK
, H4 , OK
, H5 , OK
, H6 , OK
, H7 , OK
, H8 , OK
, H9 , OK
, H10 , OK
Traitement4 , H11 , OK
];
Tb2:
NoConcatenate
LOAD *,
if(len(trim(B))>0,B,peek(T)) as T
Resident Tb1
Order by H;
DROP TABLE Tb1;
Bonjour,
Merci pour votre réponse, ça a bien marché!
mais lorsque je l'applique dans une boucle, car j'ai plusieurs onglets dans le fichier Excel, il affiche toutes les lignes que pour le premier onglet!
FOR i=1 to 52
Source_Gestion_Mensuel:
LOAD
B,
C,
H,
J
FROM File;
Data:
load
if(len(B),B,peek(Traitement)) as Traitement,
C as date_reception,
H as date_traitement,
if(len(J),J,peek(Objectif)) as Objectif
Resident Source_Gestion_Mensuel ;
drop table Source_Gestion_Mensuel;
NEXT;
Il faut charger tous les onglets dans une table avec Concatenate puis ensuite utiliser la fonction peek sur la table contenant toutes les données.
Mais il y a plus simple en fait...
Lorsqu'on charge un fichier Excel avec l'assistant QV, à la seconde fenêtre, il est possible de transformer les données et notamment remplir les cellules vides.
Ensuite pour la boucle de lecture, je me base souvent sur le script suivant : http://community.qlik.com/docs/DOC-4452
Donc pour un fichier Book1.xlsx avec 3 onglets (Sheet1, Sheet2, Sheet3), on aurait le script suivant:
LET vStartSheetNumber = 1;
LET vEndSheetNumber = 3;
LET vExcelFileName = 'Book1';
// Generate Empty table
Data:
LOAD '' AS Field1
AutoGenerate(0);
FOR index = vStartSheetNumber TO vEndSheetNumber
Concatenate(Data)
LOAD *
FROM
[$(vExcelFileName).xlsx]
(ooxml, embedded labels, table is [Sheet$(index)], filters(Replace(1, top, StrCnd(null))));
NEXT
DROP Field Field1;
exit script;