Skip to main content

Francophones

Announcements
Welcome to Qlik Community! Check out our new navigation! FIND OUT MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
HugoGarnier
Contributor II
Contributor II

FileBaseName, FileTime et Max

Bonjour,

Je possède un nombre de fichier important dans un dossier, ayant tous une date de modification différente.

Un nouveau fichier est stocké dans ce dossier tous les jours, je veux récupérer ce fichier dans QlikView.

J'ai fait un script qui permet de récupérer ce fichier en comparant la date de modification de tous les fichiers du dossier :

 

set Time = '01/01/2000 00:00:00';
set Name = '';

for each File in filelist ('C:\DetailVente\*.*')

let FileTime = FileTime('$(File)');
let Time = if ('$(FileTime)'>'$(Time)' , '$(FileTime)' , '$(Time)');
let Name = if ('$(FileTime)'>'$(Time)' , '$(File)' , '$(Name)');

next File;

 

Mais ceci nécessite de regarder la date des fichiers un par un et de les tester avec la date du fichier d'avant jusqu'à trouver la date la plus récente, ce qui est problématique avec un très grand nombre de fichier.

Je voudrais savoir si il y a une méthode plus simple ou plus rapide pour récupérer ce fichier.

Est-ce qu'il serait possible par exemple d'utiliser la fonction Max() avec la fonction FileTime() et  FileBaseName() ?

Je vous remercie par avance pour vos réponses.

2 Solutions

Accepted Solutions
ezkurdim
Contributor II
Contributor II

Bonjour Hugo,

Je l'ai fait sous QS mais tu peux simplement l'adapter sous QV

Essaye ceci !

Fichiers:
  First 1
  LOAD
 	FileName() as NomFichier,
	FileTime() as DerniereModif
FROM [lib://QVD Files/*.qvd]
(qvd);

NoConcatenate

FichiersTemp:
  Load
	NomFichier,
	DerniereModif
Resident Fichiers
Order by DerniereModif asc; 


Let vNomFichier = peek('NomFichier',-1, 'FichiersTemp');

Drop tables Fichiers, FichiersTemp;
//Chargement des données du fichier récupéré
Data:
  Load
    *
FROM [lib://QVD Files/$(vNomFichier)]
(qvd);

 

View solution in original post

HugoGarnier
Contributor II
Contributor II
Author

Bonjour,

Merci beaucoup pour ta réponse, c'est ce qu'il me fallait.

Possédant la date de création du fichier dans son nom (exemple : journal_20190327), j'ai décidé de trier par cette date plutôt que la date de modification, afin de ne pas avoir de problème si un ancien fichier doit être modifié.

Voici le code final :

 

Fichiers:
First 1
LOAD
FileName() as NomFichier,
date(mid(FileBaseName(),9,8),'DDMMYYYY') as DateNomFichier

FROM ['C:\DetailVente\journal*.csv']
(txt, utf8, embedded labels, delimiter is ';', msq);;

NoConcatenate

FichiersTemp:
Load
NomFichier,
DateNomFichier
Resident Fichiers
Order by DateNomFichier asc;


Name = peek('NomFichier',-1, 'FichiersTemp');

Drop tables Fichiers, FichiersTemp;

 

(PS: Je n'avais pas compris l'utilité du "First 1" au début et j'ai osé recharger mon application sans le mettre... mauvaise idée !!)

 

Encore merci et bonne journée.

View solution in original post

5 Replies
lcloatre
Partner - Creator III
Partner - Creator III

Bonjour,

Pourquoi tu ne mets pas les fichiers traités dans un répertoire "Archives", par exemple ?

Ce serait plus simple.

HugoGarnier
Contributor II
Contributor II
Author

Merci beaucoup pour ta réponse,

C'est une bonne idée mais nous ne voulons pas intervenir manuellement dans le dossier.

lcloatre
Partner - Creator III
Partner - Creator III

Tu peux utiliser la commande EXECUTE dans ton script :

execute cmd.exe /C move /Y "$(File)" "$(FileDestination)";

ezkurdim
Contributor II
Contributor II

Bonjour Hugo,

Je l'ai fait sous QS mais tu peux simplement l'adapter sous QV

Essaye ceci !

Fichiers:
  First 1
  LOAD
 	FileName() as NomFichier,
	FileTime() as DerniereModif
FROM [lib://QVD Files/*.qvd]
(qvd);

NoConcatenate

FichiersTemp:
  Load
	NomFichier,
	DerniereModif
Resident Fichiers
Order by DerniereModif asc; 


Let vNomFichier = peek('NomFichier',-1, 'FichiersTemp');

Drop tables Fichiers, FichiersTemp;
//Chargement des données du fichier récupéré
Data:
  Load
    *
FROM [lib://QVD Files/$(vNomFichier)]
(qvd);

 

HugoGarnier
Contributor II
Contributor II
Author

Bonjour,

Merci beaucoup pour ta réponse, c'est ce qu'il me fallait.

Possédant la date de création du fichier dans son nom (exemple : journal_20190327), j'ai décidé de trier par cette date plutôt que la date de modification, afin de ne pas avoir de problème si un ancien fichier doit être modifié.

Voici le code final :

 

Fichiers:
First 1
LOAD
FileName() as NomFichier,
date(mid(FileBaseName(),9,8),'DDMMYYYY') as DateNomFichier

FROM ['C:\DetailVente\journal*.csv']
(txt, utf8, embedded labels, delimiter is ';', msq);;

NoConcatenate

FichiersTemp:
Load
NomFichier,
DateNomFichier
Resident Fichiers
Order by DateNomFichier asc;


Name = peek('NomFichier',-1, 'FichiersTemp');

Drop tables Fichiers, FichiersTemp;

 

(PS: Je n'avais pas compris l'utilité du "First 1" au début et j'ai osé recharger mon application sans le mettre... mauvaise idée !!)

 

Encore merci et bonne journée.