15 novembre 2006

Importer un fichier texte dans un fichier Hyper File en formatant des dates

L'importation d'un fichier texte dans un fichier Hyper File est facilitée par la commande "HImporteTexte". Dans le cas favorable, l'importation est donc extrêmement simple grâce à cette fonction. Bien évidemment, suivant l'origine des données à importer, on se trouve en dehors du "cas favorable", il suffit par exemple qu'une date n'ait pas le format "AAAAMMJJ" attendu.

Dans ce cas, il faut avoir recours à une bonne vieille moulinette, facilitée par l'instruction POUR TOUT.

L'exemple ci-dessous utilise une demande du forum, ce sujet revenant assez régulièrement d'ou l'idée de ce billet. Il faut souligner qu'il s'applique aux dates, mais également à tout ce qui peut nécessiter une conversion avant la mise en base.

Soit un fichier texte à importer avec le contenu suivant (une tabulation sépare les colonnes, un retour chariot sépare les lignes ) :

15/03/2002 abc imo 560,33
19/04/2003 klo hap 561,00
12/06/2001 dol pme 7840,00

Si la date dans le fichier texte avait été codée sous la forme "20020315" la fonction "HImporteTexte" aurait fait l'affaire. Mais avec ce codage de date, il faut mouliner (une fois de plus ?). Voici un exemple de code pouvant être utilisé :
sEnregistrementsAImporter est une chaîne
sNouvelEnreg est une chaîne
sDateNonformatée est une chaîne

sEnregistrementsAImporter = fChargeTexte("C:\MonFichier.txt")

POUR TOUTE CHAINE sNouvelEnreg DE sEnregistrementsAImporter SEPAREE PAR RC

sDateNonformatée = ExtraitChaîne(sNouvelEnreg, 1, TAB)
Fichier.Date = ChaîneVersDate(sDateNonformatée, "JJ/MM/AAAA")
Fichier.Personne = ExtraitChaîne(sNouvelEnreg, 2, TAB)
Fichier.Libellé = ExtraitChaîne(sNouvelEnreg, 3, TAB)
Fichier.Montant = ExtraitChaîne(sNouvelEnreg, 4, TAB)

HAjoute(Fichier)
FIN

Une bonne évolution de la fonction "HImporteTexte", serait de pouvoir donner dans les délimiteurs un format de date comme le prend la fonction "ChaîneVersDate". Le champ d'action de "HImporteTexte" serait grandement étendu. J'en ai fait la suggestion au support.

4 commentaires:

Anonyme a dit…

Merci votre code fonctionne très bien avec moi. Cependant, il semble soutenir un petit défaut. :-) La fonction fChargeTexte implique un temps d'attente considérable lorsque le fichier à importer contient quelques milliers d'enregistrements. Il existe certainement un moyen de traiter cette requête à l'aide de fonctions telles que fLitLigne et fOuvre, mais je ne saurais pas comment procéder.

Vous avez une idée? ^_^

afrodje a dit…

Bravo et merci !

welcom a dit…

Merci bien pour le code mais j'aimerais bien avoir une réponse à propos de la question de kad puisque j'ai le même problème

Merci d'avance....

Elian Lacroix a dit…

Une alternative peut consister à effectuer le chargement dans un thread secondaire de votre application, afin de ne pas bloquer l'utilisateur dans sa tâche en cours. Il est également possible de "sous-traiter" le traitement à un autre programme de votre réalisation prévu à cet effet, et lancé par la fonction "LanceAppli". C'est intéressant notamment si l'importation doit être faite régulièrement.
Enfin pour conserver le traitement en direct, vous pouvez tenter de le faire par "blocs" en utilisant fLit :
- lecture d'une partie du fichier,
- importation de son contenu,
- lecture du bloc suivant ...