Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
Je charge actuellement des fichiers dans un folder via ce script récupéré sur le forum. Et je doit aussi transformer les données.
- 1er etape chargement données
- 2 eme étape transformation
1er etape via ce script
set Concatenate=; // used to insert concatenate in load statement after the first file loaded
// subroutine
sub ScanFolder(Root)
for each Ext in '*.txt' // use this to identify file names to load
//for each Ext in 'txt' // or simply indicate an extension types to load
for each FoundFile in filelist(Root & '\*' & Ext)
FileList: // don't worry about the squigly lines. they are there because of the concatenate variable. will run fine.
$(Concatenate)
load *
from [$(FoundFile)](txt, utf8, no labels, delimiter is '\t', msq, no eof); // parameters here might change depending on the files you are loading
set Concatenate = concatenate;
next FoundFile
next Ext
for each SubDirectory in dirlist(Root&'\*')
call ScanFolder(SubDirectory)
next SubDirectory
end Sub
// place the root directory you want to cycle through here.
Call ScanFolder('.....');
Les données sont dans une table avec FileList avec un champ @1.
2 eme étape : transformation.
Or les données ont ce format par exemple sans en tête.
20170929;0312;4040000000D93086;111
Que je transforme via ce script:
LOAD *
From_Field (FileList,data)
(txt, utf8, explicit labels, delimiter is ';', no quotes);
Mais j'aimerais avoir le nom du fichier d'origine répété pour chacune des lignes avec les données bien splittées.
Ex fichier
nom fichier code1 code2 code3 code4
toto1 20170929 0312 4040000000D93086 111
Pense qui faudrait faire ce travail directement lors du chargement plutôt qu'en deux étapes? Mais je vois pas comment?
Merci d'avance.
Bonjour,
Si les fichiers ont tous le même format, l'étape de transformation peut être fait directement dans la boucle de chargement de la routine ScanFolder ; La deuxième étape n'est pas nécessaire.
Dans la routine chargement, il faudrait donc:
-Spécifier les bonnes propriétés des fichiers sources (encodage, séparateur...)
-Ajouter une fonction pour récupérer le nom du fichier (FileBaseName(), FilePath()...).
Ce qui donnerait quelque chose comme:
$(Concatenate)
load * ,
FileBaseName() as [nom fichier]
from [$(FoundFile)](txt, utf8, explicit labels, delimiter is ';', no quotes);
A noter également, si tous les fichiers sont dans le même dossiers (pas de sous dossiers), il n'y a pas besoin de la boucle récursive et le script peut etre simplifié.
Martin
Bonjour,
Si les fichiers ont tous le même format, l'étape de transformation peut être fait directement dans la boucle de chargement de la routine ScanFolder ; La deuxième étape n'est pas nécessaire.
Dans la routine chargement, il faudrait donc:
-Spécifier les bonnes propriétés des fichiers sources (encodage, séparateur...)
-Ajouter une fonction pour récupérer le nom du fichier (FileBaseName(), FilePath()...).
Ce qui donnerait quelque chose comme:
$(Concatenate)
load * ,
FileBaseName() as [nom fichier]
from [$(FoundFile)](txt, utf8, explicit labels, delimiter is ';', no quotes);
A noter également, si tous les fichiers sont dans le même dossiers (pas de sous dossiers), il n'y a pas besoin de la boucle récursive et le script peut etre simplifié.
Martin
Salut martin,
Merci pour ton aide,
Juste une précision. Pour la boucle récursive, j'ai essayé de l’alléger mais je vois pas ce que je peux enlever sans faire planter le lancement?
Martin Sorel <span class="icon-status-icon icon-partner" title="Partner"></span> a écrit:
A noter également, si tous les fichiers sont dans le même dossiers (pas de sous dossiers), il n'y a pas besoin de la boucle récursive et le script peut etre simplifié.
Martin
Pour la partie séparation des données dans la boucle cela fonctionne parfait.
Juste une précision j'ai pas tous les champs qui sont séparés correctement dans ma ligne pour chaque ";"
Alors que lorsque je traitais les données aprés coup j'avais bien une colonne pour chaque élément de la ligne.
Exemple :
nom fichier code1 code2 code3 code4
toto1 20170929 0312 8004 120
La j'ai bien les 3 premiers codes mais j'ai pas le code 4 par exemple, surtout que je dois avoir une dizaine d'éléments séparés par une ";" après qui n’apparaissent pas.
Merci par avance et bonne soirée.
J'ai trouvé mon problème, je posterais sur une nouvelle discussion car cela n'a pas vraiment de lien avec le sujet actuel.