Besoin de retravailler un fichier .DAT sans avoir accès au logiciel d'origine.

Pourlenul - 5 oct. 2012 à 17:12
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 10 oct. 2012 à 21:07
Bonjour,
Tout d'abord désolé si cette question n'est pas postée au bon endroit, mais ne ne sais pas où la poser et comme je souhaiterais pouvoir travailler à partir de macro excel.... Merci pour votre indulgence.

J'ai un fichier DAT qui enregistre les données historiques de ma station météo. Lorsque j'effectue un extract en TXT, c'est la totalité de ce fichier DAT qui est enregistrée. Si je fais mes sauvegardes historiques sous un autre nom historique, je perds la totalité de mon ancien historique dans le nouveau fichier. (Normal!!!)
Comme ce fichier DAT augmente au fil des jours, je souhaiterais pouvoir n'effacer dans le fichier DAT que les enregistrements par exemple antécédents à J-60.
Quelqu'un a-t-il une solution?
(Je n'ai pas trouver comment joindre une copie du fichier dans ce message)

15 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
5 oct. 2012 à 17:25
Bonjour,
je ne vois personnellement pas d'autre solution que celle d'alimenter "ton" fichier en mode Append. (ton aide VBA à ouvrir sur ce mot, puis ===>> Open Instruction).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
5 oct. 2012 à 17:52
Maintenant, en te relisant, je ne suis pas certain d'avoir exactement tout deviné.
Peux-tu reformuler de manière plus précise ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
En fait je cherche une solution pour éditer le fichier .DAT afin de supprimer les plus ancien enregistrements sans recommencer un fichier historique à zéro.
Mais çà semble bien compliqué, je crois que je vais passer par plusieurs fichiers txt, çà je devrais arriver à gérer.
Merci bcp pour ton aide. Si tu as une solution pour que je puisse travailler directement le .dat, je suis preneur.
Merci encore.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
5 oct. 2012 à 18:18
En fait je cherche une solution pour éditer le fichier .DAT afin de supprimer les plus ancien enregistrements sans recommencer un fichier historique à zéro

Alors tout le reste (la provenance du fichier, etc ...) ne faisait que "noyer le poisson".
Au bout du compte :
Tu as un fichier Dat (quelle qu'en soit l'origine) que tu veux modifier.
Il te faut alors l'ouvrir en lecture, le lire ligne par ligne, écrire dans un second fichier les lignes que tu "retiens", puis fermer les deux fichiers.
Tout cela se fait par l'instruction Open (for input pour lire et for Output pour écrire).
Et non seulement l'aide vba est claire (instruction Open), mais le moteur de recherche de ce forum te conduirait à une véritable foultitude d'exemples de lecture/écriture de fichier texte
Sers-t'en, s'il te plait.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ssauvage Messages postés 47 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 9 octobre 2012
9 oct. 2012 à 11:07
Bonjour.

Pour manipuler les fichiers et écrire ou lire ligne à ligne, je propose l'utilisation de la bibliothèque "Scripting Runtime", à mon goût plus "propre" et plus "objet".
Pour l'utiliser, il faut ajouter une référence à "Microsoft Scripting Runtime" (scrrun.dll).
Voici un exemple de code :
Public Sub TestTextStream()

    Dim lobjFSO As Scripting.FileSystemObject
    Dim lobjTxtStream As Scripting.TextStream
    Dim i As Integer
    
    ' crée objet File System Object (pour l'exemple)
    Set lobjFSO = New Scripting.FileSystemObject
    ' crée un fichier text et ouvre un text stream associé
    Set lobjTxtStream = lobjFSO.CreateTextFile("C:\temp\test.txt", True)
    
    ' on se place en fin de fichier (inutile ici, mais utile pour un fichier existant)
    lobjTxtStream.AtEndOfStream
    
    ' écrit 10 lignes (à la fin du fichier, donc)
    For i = 1 To 10
        lobjTxtStream.WriteLine ("ligne " & CStr(i))
    Next i
    
    ' ferme le text stream (important !)
    Call lobjTxtStream.Close
    
    Set lobjTxtStream = Nothing
    Set lobjFSO = Nothing

End Sub


Il existe tout un ensemble de commandes, permettant de lire les lignes, se déplacer dans le fichier, etc ...

Bon courage !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
9 oct. 2012 à 11:10
Bonjour, ssauvage
FSO n'est pas "plus propre".
FSO est plus lourd et plus lent.
L'instruction Open est parfaitement adaptée, par contre !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
9 oct. 2012 à 11:13
J'ajoute pour ton info, ssauvage, que VBS et donc FSO ont été bannis de ma machine (raisons de sécrurité) et que tel est le cas de plus en plus fréquent sur d'autres machines, hein ...
Alors : une appli utilisant FSO ===>> bonjour les problèmes de portabilité aléatoire ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ssauvage Messages postés 47 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 9 octobre 2012
9 oct. 2012 à 11:49
En .NET, il existe des bibliothèques adaptées, robustes, performantes, sous System.IO notamment. On peut envisager d’appeler une DLL .NET depuis du VBA, mais il y a du travail.

En VB6 et VBA, la bibliothèque "Microsoft Scripting Runtime" est accessible puisqu'elle référence une DLL système (sous system32).
Je ne suis pas d'accord avec l'argument de "plus lent", car l'éventuelle différence de temps vient de la robustesse et des contrôles (il n'y en a pas ou peu avec "Open", non ?). Mais utiliser des objets peut toujours paraître plus lourd que du script ...
En parlant de script, je ne vois pas le rapport du sujet avec VBS. Car même si elle se nomme "Microsoft Scripting Runtime", la bibliothèque correspond à la DLL scrrun.dll et non pas par exemple vbscript.dll.
Elle peut donc être référencée même si VBScript est désactivé. C'est le niveau de sécurité des macros qui importe ici (VBA). Mais peut-être me trompe-je ...

Enfin pour la portabilité, il est vrai que je suis parti du principe que l'OS était du Microsoft Windows ...

Bonne journée
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
9 oct. 2012 à 13:07
Rhoooo...
la lourdeur tient à l'importation même de FSO !
VB.Net n'utilise pas FSO
Pour ton info, puisque tu sembles ne pas le savoir :
l'objet FSO dépend directement du runtime de VBScript
Je préfère (excuse-moi) ne pas relever le reste ... (je tiens à faire une sieste paisible en rêvant à ma prochaine daurade, hein ...).



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ssauvage Messages postés 47 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 9 octobre 2012
9 oct. 2012 à 15:31
Ucfoutu,
Effectivement, scrrun.dll est la runtime ... de script, donc vbscript, même s'il existe une DLL vbscript.dll.
Pour la lourdeur, je n'ai jamais essayé sur de très gros volumes de données. Sans doute peut-il y avoir des différences. A moins que tu ne pensasses au poids de la DLL (168 ko) ?
Par contre, je maintiens ce que j'ai dit quant au caractère "objet".
Question sécurité, qu'entendais-tu par désactivation de VBscript ? L'interdiction d’exécution de la runtime ? L'interdiction d’exécution de fichier VBS ?

Bonne daurade en tout cas
0
ssauvage Messages postés 47 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 9 octobre 2012
9 oct. 2012 à 16:02
J'ai omis de donner ce lien de référence (MSDN) :
Writing to a Text File from within a Macro in the 2007 Office System
Cordialement,
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
9 oct. 2012 à 17:02
Je ne souhaite pas que l'on revienne, une fois de plus, discuter de ce FSO.
Cela a déjà éré fait de trop nombreuses fois.
Je préfère t'inviter à lire les nombreuses discussion ouvertes à ce sujet, y compris sur ce forum.
Tiens : voilà la première que me retourne le moteur de recherche :
Tapez le texte de l'url ici.
J'ai volontairement choisi (souci d'impartialité) une discussion à laquelle je n'ai pas participé.
Elle date de 2005 !
Lis-la entièrement. Elle t'apprendra beaucoup de petites choses.
Attarde(-toi plus particulièrement sur l'intervention de Neo.balastik. Il y parle d'à peu près tout ce dont je t'ai parlé, y compris des problèmes éventuels de portabilité.
J'y ajoute simplement que se passer de FSO ne signifie pas forcément avoir à utiliser directement les fonctions de l'API de Windows. On arrive à la même vitesse qu'avec l'Api de Windows (ou presque), à l'aide de VB6 ou VBA seul.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ssauvage Messages postés 47 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 9 octobre 2012
10 oct. 2012 à 18:29
Merci pour ces informations.
Ce qui y est dit est fort intéressant. La comparaison en lien avec la différence API/FSO est forcément pertinente, surtout dans le cadre d'une application professionnelle.
Mais si on les réécrit entièrement en API, de fait, beaucoup de composants s'améliorent !
Le problème de fond est qu'il n'existe pas de composant VBA/VB6 performant pour la manipulation de fichiers. Il faut sinon aller vers .Net.
C'est pour ça que Microsoft préconise encore l'utilisation de FSO en VBA pour Office sur msdn ...
Pour un débutant en VBA, je choisis de lui conseiller FSO plutôt que lui suggérer d'écrire un ensemble de classe manipulant les APIs ... C'est juste un choix.
Merci à toi en tout cas ucfoutu, j'ai appris des choses.
Bien cordialement,
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
10 oct. 2012 à 19:09
Allons, ami ssauvage ...
il n'existe pas de composant VBA/VB6 performant pour la manipulation de fichiers.

Même pas la peine de composants ! VBA dispose de tout ce qu'il faut (sans fonctions de l'API !)
L'instruction Open
La fonction Dir
sont très simples d'utilisation
Un composant pour quoi faire de mieux ?!
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
10 oct. 2012 à 21:07
Je reviens, ami ssauvage, après un bon repas (bien arrosé, en plus).
Alors :*
1) le code que tu as proposé, a savoir :
Public Sub TestTextStream()

    Dim lobjFSO As Scripting.FileSystemObject
    Dim lobjTxtStream As Scripting.TextStream
    Dim i As Integer
    
    ' crée objet File System Object (pour l'exemple)
    Set lobjFSO = New Scripting.FileSystemObject
    ' crée un fichier text et ouvre un text stream associé
    Set lobjTxtStream = lobjFSO.CreateTextFile("C:\temp\test.txt", True)
    
    ' on se place en fin de fichier (inutile ici, mais utile pour un fichier existant)
    lobjTxtStream.AtEndOfStream
    
    ' écrit 10 lignes (à la fin du fichier, donc)
    For i = 1 To 10
        lobjTxtStream.WriteLine ("ligne " & CStr(i))
    Next i
    
    ' ferme le text stream (important !)
    Call lobjTxtStream.Close
    
    Set lobjTxtStream = Nothing
    Set lobjFSO = Nothing

End Sub


1) contient une énorme faute, si mes souvenirs de VBS sont nons !
Où ? au niveau de cette ligne :
' on se place en fin de fichier (inutile ici, mais utile pour un fichier existant)
lobjTxtStream.AtEndOfStream ' === >>> mama mia ! ArEnd machin chouette n'est pas une méthode !
' c'est une propriété dont on ne peut constater que si False ou si True (en fin de fichier). Elle est en lecture seule !

Alors alors !
Voyons don un peut comment traduire tout bêtement tout ce tsoin-tsoin sans FSO et uniquement avec VBA pour faire ce que disent faire tes commentaires ===>>
Open "D:\BSNTOU.txt" For Append As #1
      For i = 1 To 10
        Print #1, "ligne blabla " & CStr(i)
      Next i
    Close #1

et rien de plus. Sans référence ajoutée, sans FSO "importé", tout bête : on ouvre, on ajoute à la fin (Append). et "picétou"
Si tu en veux d'autres, dis-nous
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0