VB - lecture / écriture fichier txt - choix ligne

dieu08

XLDnaute Occasionnel
Bonjour les forumiteux,

Après une absence trop longue de ce forum, je reprends mes travaux en VB sur une problèmatique liée à des manipulations de lecture-écriture sur des fichiers txt.

Après quelques recherches, je suis parvenu à obtenir un script fonctionnel pour lire les données d'un fichier structuré, les stocker dans les cellules, les écrire dans un nouveau fichier txt.

Structure

VB:
Public nomfich1 As String

Type interface

    'tronc commun
    int1 As String * 8
    int2 As String * 8
    int3 As String * 8
    int4 As String * 3
    int5 As String * 6
    int6 As String * 9
    int7 As String * 2
   
    'détails mouvements
    int8 As String * 1
    int9 As String * 1
    int10 As String * 1
         
End Type

Script lecture

VB:
intFic2 = FreeFile()

NbLigne = 1

Open nomfich1 For Binary As #intFic2 Len = Len(MyInterface)

            Do While Not EOF(1)
                                           
            ' lecture fichier et repart dans les variables
                           
                               Get #intFic2, , MyInterface
                                    Cells(NbLigne, 1) = MyInterface.int1
                                    Cells(NbLigne, 2) = MyInterface.int2
                                    Cells(NbLigne, 3) = MyInterface.int3
                                    Cells(NbLigne, 4) = MyInterface.int4
                                    Cells(NbLigne, 5) = MyInterface.int5
                                    Cells(NbLigne, 6) = MyInterface.int6
                                    Cells(NbLigne, 7) = MyInterface.int7
                                    Cells(NbLigne, 8) = MyInterface.int8
                                    Cells(NbLigne, 9) = MyInterface.int9
                                    Cells(NbLigne, 10) = MyInterface.int10
                                               
            NbLigne = NbLigne + 1
                                    
            Loop
                      
Close #intFic2

Script écriture

VB:
For intFic = 1 To nbcount0

Open "infodb_test.dat" For Random As intFic Len = Len(MyInterface)

With MyInterface
    .int1 = Cells(intFic, 1)
    .int2 = Cells(intFic, 2)
    .int3 = Cells(intFic, 3)
    .int4 = Cells(intFic, 4)
    .int5 = Cells(intFic, 5)
    .int6 = Cells(intFic, 6)
    .int7 = Cells(intFic, 7)
    .int8 = Cells(intFic, 8)
    .int9 = Cells(intFic, 9)
    .int10 = Cells(intFic, 10)
End With

' compte le nombre d'enregistrements

intNum = LOF(intFic) / Len(MyInterface)
   Put intFic, intNum + 1, MyInterface
                 
Close #1

Next intFic

Mon fichier txt dispose d'une première ligne d'en-tête et les lignes suivantes sont des lignes de détails (correspondant à la structure définie dans mon script).

De ce fait, le traitement devrait être différent mais je ne parviens pas à trouver la manière d'indiquer dans le script que la ligne 1 doit être traiter sur un modèle et la ligne 2 (et éventuellement les suivantes) sur un autre modèle.

Merci pour votre aide.

Dieu08.
 

Roland_M

XLDnaute Barbatruc
Bonjour,

il faudrait voir la structure du fichier txt !
car si c'est du séquentiel ton script ne correspond pas du tout !

si c'est du séquentiel et qu'ensuite tu sauvegardes avec Put, ce n'est plus du tout pareil pour le relire !

si tu as une ligne d'entête de longueur différente du reste structuré, avec ta méthode ça ne va pas le faire !

une Line Input peut extraire cette ligne en testant si c'est la 1'ligne en mode binary ou séquentiel puis extraire le reste.
mais en mode binary ça va pas le faire à cause des longueurs, il faut calculer la position et savoir s'il y a derrière un retour ligne !?

c'est pour cela qu'il faudrait voir la structure exacte du fichier à extraire et joindre aussi un exemple de ton code plutôt que tes morceaux à copier ça simplifierai le travail aux intervenant !

EDIT:
ton code ne fonctionne pas en l'état, il manque ceci: Dim MyInterface As interface
et la valeur de nbcount0 !?

ensuite tu emploies intFic puis #1 ! à revoir car c'est intFic !
 
Dernière édition:

dieu08

XLDnaute Occasionnel
Roland,

Je viens de lire et tester les deux scripts (pour la partie 'lecture") que tu m'as gentiment transmis. La répartition dans les cellules est correcte dans tous les cas.

Par contre, deux éléments ne sont pas accessibles à ma compréhension :
  • la manière d'exclure la première ligne qui doit avoir un traitement différent (structure d'interface différente) pour les deux scripts
  • la manière dont tu lis les données séparées par des virgules alors que la structure d'interface ne mentionne pas la ',' [script 2]
Je te remercie pour tes précisions.

Dieu08,
"2000 ans sans répondre...merci FEDEX "
 

Roland_M

XLDnaute Barbatruc
Re

c'est pour cela que j'avais dis qu'il fallait voir la structure de ton fichier txt !?
à quoi ressemble t'il ?

est-ce du texte classique avec des lignes séparées ou autre ?

un exemple serait bien venu !

EDIT:
"2000 ans sans répondre...merci FEDEX "

quand je parle des 2000 ans, c'est l'attente d'un signe dans la prière !
 

dieu08

XLDnaute Occasionnel
Re,

Je te prépare le package zippé dès demain pour te permettre de mieux appréhender ma problématique.

En tous les cas, mes deux interrogations partaient de mon incompréhension (ou mon incapacité - intellectuelle) à décrypter ton code pour connaitre ta manière de traiter les deux problèmatiques que j'évoquais.
 

dieu08

XLDnaute Occasionnel
Bonjour Roland,

Je t'ai joint le package compressé afin que tu puisses disposes de l'ensemble des données.

Tu disposes du fichier sur lequel je dois travailler "infodb_origine.dat" qui disposes d'une ligne d'en-tete différente de la ligne suivante qui est une ligne de détail.

Les deux autres fichiers *.dat sont des fichiers de test : ""infodb_travail.dat" qui ne contient qu'une ligne de détail sans ligne d'en-tete. La lecture-écriture fonctionne très bien avec le script du module 2.

Mais comme je te l'indiquais, je souhaite que la ligne d'en-tete soit traité selon une structure différente et je dois donc l'exclure du traitement du module 2.

Le module 3 est un test avec le fichier "fichier_test.dat". Le script n'a pas beaucoup d’intérêt pour toi je pense.

Je suis à l'écoute de tes conseils et de tes pistes pour me permettre d'aboutir. Merci.

"Signe donné via les navettes SNCF..."
 

Pièces jointes

  • dieu08.zip
    30.6 KB · Affichages: 25

Roland_M

XLDnaute Barbatruc
bonjour,

tout d'abord pour essayer ce n'est pas évident car il faudrait créer tout un tas de chemins
et surtout, quand on est pas de la partie, on ne sait pas à quoi ressemble le résultat final des données !?
il ne serait pas possible de tirer des conclusions.

j'en reste donc à la question principale, sauter la 1'ligne.
en lisant les fichiers avec simplement input j'obtient ceci:

avec l'origne "infodb_origine.dat" (avec 1'ligne à éviter), il contient 4 lignes:
1' 1533 caractères
2' 456 :::
3' 12 :::
4' 1022 :::

après réécriture "infodb_travail.dat" sans la première ligne, il contient 3 lignes:
1' 456 caractères
2' 12 :::
3' 1022 :::

j'en conclu qu'il faut donc extraire les 1533 caractères + fin/saut de ligne (1 ou 2 caractères !?)
d'après les déclarations il semblerait qu'il n'y ai qu'un caractère !?

je propose que tu essaies d'abord avec 1534 et selon résultat voir 1535 (je pense que ce sera 1534)
puis voir quel est le résultat souhaité !?

avec X$ = Input(1534, #1) (tu peux toujours aussi essayer 1533)

soit, dans ton code, à cet emplacement:
---------------------------------------
Open nomfich1 For Binary As #intFic2 Len = Len(MyInterface)

X$ = Input(1533, #1) '< ici 1533 puis 1534 et 1535 (je pense que c'est 1534 !)

Do While Not EOF(1)
suite du code ...
---------------------------------------
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re

tu peux aussi essayer ceci:

remplacer: X$ = Input(1534, #1)
par ceci : Line Input #1, X$

et voir le résultat !?

car la différence entre l'origine et après est de 1576 caractères
et Line Input #1, X$ extrait justement 1576
 

Roland_M

XLDnaute Barbatruc
re

mais c'est pourtant simplissime !
j'extrait simplement cette première ligne que tu veux sauter, et ensuite la boucle extrait la suite selon ton souhait !

qu'est ce que tu ne comprends pas là-dedans ?
le fichier est ouvert,
j'extrait la 1'ligne avec X$ = Input(1534, #1) ou Line Input #1, X$
selon le résultat de l'extraction qui suit en boucle et que tu peux voir sur ta feuille par après si ok !?

si tu ne comprends rien aux fichiers ça va être problématique pour la suite !?
si j'extrait 1500 caractères la suite de l'extraction se fera à partir du 1501' caractère.
 
Dernière édition:

dieu08

XLDnaute Occasionnel
Roland,

C'est la syntaxe qui me posait problème plus que la compréhension. Je l'ai intégré dans mon script sous cette forme :

VB:
If Not EOF(intFic2) Then Line Input #intFic2, strLigne

Si je désire que cette 1'ligne soit traitée selon une autre type de structure, je peux à la suite de cette instruction et avant la boucle, intégré un "Call" vers une autre macro ?

Merci.
 

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi